【问题标题】:How do I compare a value to an ntext column? [duplicate]如何将值与 ntext 列进行比较? [复制]
【发布时间】:2013-04-02 02:22:40
【问题描述】:

我正在做一个项目,在该项目中,我将 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。文本)。

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

【问题讨论】:

标签: c# asp.net sql sql-server-2008


【解决方案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)字符?

【讨论】:

  • d.text 的类型是 ntext,在保存和阅读之前我已经从文本中删除了空格。我已经尝试了你的建议,但它没有显示结果。
【解决方案2】:

试试这个

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

【讨论】:

  • 不工作,因为 d.text 的类型是 ntext。
  • 你试过将 d.text 转换为 varchar 吗? where Charindex(convert(varchar(max),d.text), @docText) > 0
  • 是的,我试过了,但还是没有结果
【解决方案3】:

尝试:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多