我在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)
答案 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