根据IN()子句收集DATABASE_DEFAULT

时间:2014-02-20 14:55:23

标签: sql-server tsql collation

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

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) 

2 个答案:

答案 0 :(得分:6)

无需将所有这些内容连接成逗号分隔的字符串。

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是数字,则应使用数值数据类型,而不是字符串。

答案 1 :(得分:0)

在IN子句中使用@items变量没有意义。它将此变量视为字符串。因此,除非它只是一个值,否则它将无法正常运作。

修复它的方法是将所需的所有ID放入另一个临时表中,然后将查询与此临时表连接。

SELECT ltrim(rtrim(ItemNumber )) AS ID INTO #Items FROM #ShipTemp;

SELECT   [ITEM_KEY],
         max([REVISION]) Rev
INTO     #rev
FROM     SERVER2.[BOMSystem].[dbo].[ITEM] i
         INNER JOIN #Items is ON (i.ITEM_KEY collate DATABASE_DEFAULT = is.ID)
WHERE    DATE_EFF_FROM  <= @shipedon
GROUP BY ITEM_KEY