web-dev-qa-db-ja.com

IN()句に対​​するCOLLATE DATABASE_DEFAULT

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) 
10
SteveO

それらすべてをコンマ区切りの文字列に連結する必要はありません。

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が数値の場合は、文字列ではなく数値データ型を使用する必要があります。

7
Martin Smith

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
0
user170442