2017-06-01 63 views
0

我有一個包含數千個SKU的.CSV文件。我想查詢我的數據庫中的可用數量,僅查找此.CSV文件中列出的SKU。SQL Server:在IN()子查詢中使用OPENROWSET結果

這是我到目前爲止有:(比方說,一對夫婦的SKU被命名爲 「ABC」 和 「XYZ」)

的SQL(SQL Server 2008 R2上):

SELECT 
    [sku], [qty] 
FROM 
    [Inventory] 
WHERE 
    [sku] IN (SELECT skuColumn 
       FROM OPENROWSET(BULK 'C:\skus.csv', 
           FORMATFILE='C:\skusFormat.xml') AS data) 

的CSV文件(skus.csv):

ABC 
XYZ 
... 

的XML格式的文件(skusFormat.xml):

<?xml version="1.0" ?> 
<BCPFORMAT xmlns="http://schemas.microsoft.com/sqlserver/2004/bulkload/format" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <RECORD> 
     <FIELD ID="1" xsi:type="CharTerm" TERMINATOR="\n" MAX_LENGTH="40" /> 
    </RECORD> 
    <ROW> 
     <COLUMN SOURCE="1" NAME="sku" xsi:type="SQLNVARCHAR" /> 
    </ROW> 
</BCPFORMAT> 

當我自己運行SELECT... OPENROWSET()聲明時,會返回一列SKU - 正如預期的那樣;但是,當我在IN()內將它用作子查詢時,結果爲空。

我期待的結果是來自skus.csv文件的SKU和來自Inventory數據庫的數量。我在這裏做錯了什麼?

謝謝!

+2

可能是數據類型不匹配......爲nvarchar從CSV但是從表? – maSTAShuFu

+0

這聽起來似乎合理。數據庫中的'sku'列是'CHAR'類型。我將如何將所有SKU值轉換爲某種數據類型? 我試着將格式文件中的'COLUMN'元素設置爲'xsi:type'的SQLCHAR,SQLVARYCHAR,SQLNCHAR和SQLNVARCHAR,但結果仍爲空。 – Jason

+0

請檢查我的答案,看看是否會工作 – maSTAShuFu

回答

1

可能是數據類型不匹配
和使用EXISTS代替

SELECT [sku], [qty] 
FROM [Inventory] x 
WHERE EXISTS (
    SELECT 1 FROM OPENROWSET(
     BULK 'C:\skus.csv', 
     FORMATFILE='C:\skusFormat.xml' 
    ) AS data 
    where cast(data.skuColumn as char(10)) = x.sku 
) 
+0

這工作!感謝您提供簡單的解決方案。 – Jason