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)
それらすべてをコンマ区切りの文字列に連結する必要はありません。
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
が数値の場合は、文字列ではなく数値データ型を使用する必要があります。
IN句で@items変数を使用しても意味がありません。この変数を文字列として扱います。そのため、1つの値である場合を除き、思ったとおりに機能しません。
これを修正する方法は、必要なすべての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