2017-06-01 25 views
0

Ich habe eine .CSV Datei mit Tausenden von SKUs. Ich möchte die verfügbaren Mengen in meiner Datenbank nur für die SKUs suchen, die in dieser .CSV Datei aufgelistet sind.SQL Server: Verwenden von OPENROWSET Ergebnisse innerhalb einer IN() - Unterabfrage

Hier ist, was ich bisher: (Sagen wir mal ein paar SKUs sind "ABC" genannt und "XYZ")

Die SQL (auf 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) 

der CSV Datei (skus.csv):

ABC 
XYZ 
... 

Die XML-Format-Datei (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> 

Wenn ich die SELECT... OPENROWSET()-Anweisung selbst ausführe, wird wie erwartet eine einzelne Spalte von SKUs zurückgegeben. Wenn ich es jedoch als Unterabfrage innerhalb von IN() verwende, sind die Ergebnisse leer.

Ich erwarte die Ergebnisse die SKUs aus der skus.csv Datei und ihre Mengen aus der Inventory Datenbank. Was mache ich hier falsch?

Danke!

+2

könnte Datentypkonflikt ... nvarchar von csv, aber aus der Tabelle? – maSTAShuFu

+0

Das klingt plausibel. Die 'sku'-Spalte in der Datenbank hat den Typ' CHAR'. Wie würde ich alle SKU-Werte als einen bestimmten Datentyp darstellen? Ich habe versucht, das "COLUMN" -Element in der Formatdatei auf 'xsi: Typ' s SQLCHAR, SQLVARYCHAR, SQLNCHAR und SQLNVARCHAR, aber die Ergebnisse sind immer noch leer. – Jason

+0

Bitte überprüfen Sie meine Antwort, ob das funktioniert – maSTAShuFu

Antwort

1

könnten Datentyp nicht übereinstimmen
und mit VORHANDEN statt IN

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

Das hat funktioniert! Danke, dass Sie eine einfache Lösung anbieten. – Jason

Verwandte Themen