1

我正在做一个项目,在该项目中,我将 itextsharp 提取的 pdf 文本保存在 sql server 数据库的列中。对于某些要求,我必须通过将文档文本作为参数提供给查找文档的过程来搜索文档。我的代码是

   @docText varchar(8000)

   select * from document d

   where convert(varchar(8000),d.text) = @docText

问题是,当文档文本大小小于 8000(例如 2600)时,它与此查询不匹配,并且在上述查询中,我们无法将大小设置为 convert(varchar(len(@docText)),d.text)。

如何设置列(文本)大小等于动态传递给过程的参数大小。

4

3 回答 3

1

我的第一个想法是你需要这个:

declare @docText varchar(max);

select *
  from document d
 where d.text = @docText;

VARCHAR(MAX)是一种类型,可以保存从 0 字节到 2 GB 的任何 varchar。它之所以称为 VARying-CHARacter,是因为它具有可变性。尾随空格自动被认为是无关紧要的,即 ABCDEF_____ = ABCDEF(第一个有 5 个尾随空格)。

出于这个原因(尾随空格处理),不需要CONVERT(varchar(<exact-length>), text).

该列d.text定义为什么类型?如果是 VARCHAR(8000),那么我建议将其升级为 VARCHAR(MAX)。一本书肯定有8000多个字?

你确定你没有用字符填充输入@docText 来组成8000,例如添加尾随点或字节(0)字符?

于 2013-04-02T02:26:44.880 回答
1

试试这个

where Charindex(d.text, @docText) > 0

于 2013-04-02T02:36:11.673 回答
1

尝试:

declare @docText varchar(max)
set @doctext = 'test'
select * from document d
where convert(varchar(max),d.text) like '%' +@docText+ '%'

这应该将文本值转换为可以轻松使用比较的内容,并允许您搜索文档中任何位置的特定文本块。

您还应该考虑是否要使用全文搜索。

接下来是您确实需要将文本字段更改为 varchar (max),因为不推荐使用文本。这是需要对数据库进行的关键更改。没有理由任何 2008 数据库仍应使用 text 或 ntext 数据类型。当您不对已弃用的项目进行更改时,您会导致升级路径比删除该功能时更加痛苦(通常在删除已弃用的项目之前需要多次数据库升级),并且最终意味着您无法升级。这种类型的数据库维护需要在您想要升级之前很久就完成和测试。

于 2013-04-02T21:51:33.103 回答