我正在开发一个项目,我在一个sql server数据库的列中保存由itextsharp提取的pdf文本。对于某些要求,我必须通过将文档文本作为参数提供给查找文件来查找文档document.My代码是
@docText varchar(8000)
select * from document d
where convert(varchar(8000),d.text) = @docText
问题是当文档文本大小小于8000(例如2600)时,它与此查询不匹配,并且在上面的查询中我们不能将大小设置为convert(varchar(len(@docText)),d。文本)。
如何将列(文本)大小设置为动态传递给过程的参数大小。
答案 0 :(得分:1)
我的第一个想法是你需要这个:
declare @docText varchar(max);
select *
from document d
where d.text = @docText;
VARCHAR(MAX)
是一种类型,可以将任何varchar从0字节大小保存到2 GB。它被称为VARying-CHARacter,因为它具有可变性。尾随空格自动被认为是无关紧要的,即ABCDEF_____ = ABCDEF
(第一个有5个尾随空格)。
出于这个原因(尾随空间处理),不需要CONVERT(varchar(<exact-length>), text)
。
列d.text
定义为哪种类型?如果它是VARCHAR(8000),那么我建议将其升级到VARCHAR(MAX)。一本书肯定有超过8000个字符?
你确定你没有填充带有字符的输入@docText以构成8000,例如添加尾随点或字节(0)字符?
答案 1 :(得分:1)
试试这个
where Charindex(d.text, @docText) > 0
答案 2 :(得分: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数据类型。如果不对已弃用的项目进行更改,则会导致升级路径比删除该功能时更加痛苦(通常情况下,在删除已弃用的项目之前需要进行多次数据库升级)并最终意味着您无法升级。这种类型的数据库维护需要在您想要升级之前很久就完成并进行测试。