【问题标题】:Using Varchar column of a table to search text column in another table使用表的 Varchar 列搜索另一个表中的文本列
【发布时间】:2017-06-29 02:14:51
【问题描述】:

我正在尝试查找不属于已批准公司信息 XML 的所有企业 ID。

我的业务 ID 作为 varchar(255) 数据类型存在于我的业务表中 我的 companyxml 作为 text 数据类型存在于我的 companyinfo 表中

SELECT [bus_id] FROM [dbo].[tbl_businesses]
WHERE [bus_id] NOT IN (SELECT cmp_companyXML FROM tbl_companyinfo WHERE 
    cmp_approved = 'Approved')

我收到了这个错误

消息 402,第 16 级,状态 1,第 2 行 数据类型 text 和 varchar 在等于运算符中不兼容。

由于我在两个表中都没有任何类似的数据,因此我必须使用子查询。我也在做NOT IN,所以我必须评估每个业务,然后评估我所有已批准的公司 xml,只有在它不存在时才选择它。

【问题讨论】:

  • 与您的问题无关,但如果您有 XML 数据,为什么不使用 XML 数据类型?
  • 如果cmp_companyXML 是可为空的列,NOT IN 是危险的。

标签: c# sql-server tsql


【解决方案1】:

使用CAST 将列转换为 varchar(max) 以进行有效的 SQL 比较。

select [bus_id] from [dbo].[tbl_businesses]
where [bus_id] not in 
(select cast(cmp_companyXML as varchar(max)) 
from tbl_companyinfo 
where cmp_approved = 'Approved')

【讨论】:

  • 有效,但看起来我的结果现在不起作用哈哈,它会将我拥有的所有记录返回给我
  • 您确定不需要CONTAINS 而不是IN
【解决方案2】:

这是因为文本数据类型不兼容。看看这篇文章。可能对你有用:https://blog.sqlauthority.com/2012/12/04/sql-server-fix-error-402-the-data-types-ntext-and-varchar-are-incompatible-in-the-equal-to-operator/

您可以在子查询中使用转换命令:

 select  CONVERT(VARCHAR(MAX), cmp_companyXML)...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    • 2021-01-15
    • 1970-01-01
    • 2022-12-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多