sql-server - 针对 IN () 子句 COLLATE DATABASE_DEFAULT

标签 sql-server tsql collation

我在返回存储过程中的记录时遇到问题。没有抛出错误,但我认为来自一个服务器环境的数据在另一个服务器环境中混合得不好。

set @shipedon =  YEAR(@shipdate) * 10000 + MONTH(@shipdate) * 100 + DAY(@shipdate)

这有效:

SELECT   [ITEM_KEY],
         max([REVISION]) Rev
FROM     SERVER2.[BOMSystem].[dbo].[ITEM]
WHERE    ITEM_KEY collate DATABASE_DEFAULT in
         ('391000180', '391000189', '391000191', '391000201',
          '391000214', '391000215', '391000216', '391000226')
AND      DATE_EFF_FROM <= @shipedon 
GROUP BY ITEM_KEY

显示 8 行,例如:

391000180   0001
391000189   0001
391000191   0001

这失败了:

SELECT   [ITEM_KEY],
         max([REVISION]) Rev
INTO     #rev
FROM     SERVER2.[BOMSystem].[dbo].[ITEM] 
WHERE    ITEM_KEY collate DATABASE_DEFAULT in (@items)                                                       
AND      DATE_EFF_FROM  <= @shipedon
GROUP BY ITEM_KEY

SELECT * from #rev shows no results.

SELECT @items = SUBSTRING(
(SELECT distinct ',' +''''+ ltrim(rtrim(ItemNumber )) +'''' 
collate DATABASE_DEFAULT 
FROM #ShipTemp   
FOR XML PATH('')),2,20000) 

最佳答案

无需将它们全部连接成逗号分隔的字符串。

IN 接受返回要测试的单列项目的子查询。只需使用

SELECT [ITEM_KEY],
       max([REVISION]) Rev
INTO   #rev
FROM   SERVER2.[BOMSystem].[dbo].[ITEM]
WHERE  ITEM_KEY COLLATE DATABASE_DEFAULT IN (SELECT LTRIM(ItemNumber )
                                             FROM   #ShipTemp)
       AND DATE_EFF_FROM <= @shipedon
GROUP  BY ITEM_KEY 

也不需要RTRIM,因为尾随空格在比较中并不重要,如果ItemNumber是数字,则应该使用数字数据类型,而不是字符串。

关于sql-server - 针对 IN () 子句 COLLATE DATABASE_DEFAULT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21911390/

相关文章:

sql - MS SQL服务器: Check to see if a user can execute a stored procedure

MySQL 区分大小写(或者,如何在 MySQL 中正确存储密码)

sql - 选择一列中具有重复值的行

sql-server - SQL Server 2008 脚本 - 如何从系统获取当前日期并将其存储到日期列中

sql - 跨服务器SQL

sql - 在某些 Sql 代码中,如何获取给定索引的字符串的字符值?

php - 如何使用 mysqli 设置排序规则?

葡萄牙语的 MySQL 排序规则

sql - 执行相同的查询两次,但使用单个不同的 WHERE 子句

sql-server - 通过 unixODBC 和 FreeTDS 从 MSSQL 返回西里尔符号的问题