2016-05-24 10 views
0

Ich weiß, das ist schmutzig, aber ist es eine Möglichkeit, csv Daten zu senden (Wagenrücklauf getrennt) in genau diesem Format:Senden csv Daten gespeicherte Prozedur und Einfügen in #temp Tabelle

1,2,"Bla1" 
3,4,"Bla2" 

auf eine gespeicherte Prozedur und fügen Sie es in eine #temp-Tabelle ein.

Skeleton:

IF EXISTS (SELECT * 
      FROM sys.objects 
      WHERE type = 'P' AND name = 'USP_Test') 
    DROP PROCEDURE USP_Test 
GO 

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

CREATE PROCEDURE USP_Test 
    @CsvData NVARCHAR(MAX) 
AS 
BEGIN 
    SET NOCOUNT ON; 

    CREATE TABLE #Temp 
     (
      Number1 FLOAT, 
      Number2 FLOAT, 
      String NVARCHAR(255) 
     ) 

    -- insert @CsvData into #Temp 
END 

Ich mag Tabellenwertparameter für diese Art von Szenario, aber ich kann steuern, nur dass ein nvarchar gesendet wird.

+1

Mögliche Duplikat [Read String mit Komma und fügen Sie in SQL-Tabelle einreihige] (http://stackoverflow.com/questions/37404919/read-string-with- comma-and-insert-in-sql-table-single-row) –

+0

Es gibt einen Weg, aber Sie müssen mit der Eingabe besonders vorsichtig sein. zumindest weißt du, dass es dreckig ist ... –

+0

Was passiert mit der letzten Spalte, wenn ein Zitat im Feldwert steht? Verdoppelt sich das? 1,2, "Joe" "Die peinliche" "Bloggs" –

Antwort

2

Sie können es mit XML machen, aber wenn die Eingabedaten groß sind, können Leistungsprobleme auftreten.

DECLARE @CsvData nvarchar(max) = 
'1,2,"Bla1" 
3,4,"Bla2" 
5,6,"Bla3" 
7,8,"Bla4" 
9,10,"Bla5" 
11,12,"Bla6" 
13,14,"Bla7" 
15,16,"Bla8" 
16,18,"Bla9"' 

DECLARE @xml xml 

SELECT @xml = CAST('<row>' + REPLACE('<s>' + REPLACE(@CsvData,',','</s><s>')+'</s>',CHAR(13)+CHAR(10),'</s></row><row><s>') + '</row>' as xml) 


SELECT t.v.value('s[1]','float') as Number1, 
     t.v.value('s[2]','float') as Number2, 
     t.v.value('s[3]','nvarchar(255)') as String 
FROM @xml.nodes('/row') as t(v) 

Ausgang:

Number1 Number2 String 
1  2  "Bla1" 
3  4  "Bla2" 
5  6  "Bla3" 
7  8  "Bla4" 
9  10  "Bla5" 
11  12  "Bla6" 
13  14  "Bla7" 
15  16  "Bla8" 
16  18  "Bla9" 
+0

was für eine großartige Idee, ich werde das versuchen ... – cs0815

Verwandte Themen