2016-04-19 4 views
2

Ich bin eine Anwendung mit Microsoft Access als Front-End und SQL Server als Back-End erstellen.Einfügen mehrerer Werte in mehrere Zeilen mit einem Parameter in T-SQL

Ich habe eine gespeicherte Prozedur, die Kundeninformationen einfügt. Eine der Informationen, die für jeden Kunden eingefügt werden, sind ihre Kreditkartennummern. Die Anzahl der Kreditkarten für jeden Kunden kann zwischen 1-50 liegen.

Ich plane, ein dynamisches Array in VBA zu verwenden, um die Kreditkartennummern hinzuzufügen. Das Problem, das ich habe, ist, ich bin nicht ganz sicher, wie man die Werte an die gespeicherte Prozedur weitergibt.

Mein erster Gedanke war es, eine Tonne von Parametern (CC Nummer 1, CC Nummer 2, CC Nummer 3, usw.) zu erstellen, aber offensichtlich ist dies nicht der richtige Weg, dies zu tun.

Nachdem die Kreditkartennummern dem Dynamic Array hinzugefügt wurden, kann ich ReDim verwenden, um die Anzahl der Kreditkartennummern zu ermitteln, die ich einfügen muss.

Was wäre der beste Weg, um beispielsweise 14 Kreditkartenwerte an einen Parameter zu übergeben und jeden Wert als neue Zeile einzufügen?

+2

Tabellenwerte? https://msdn.microsoft.com/en-us/library/bb510489.aspx – Kritner

+0

@Kritner: Aber wie würde man dies von Access nennen? - Wenn eine gespeicherte Prozedur ein Muss ist, würde ich sie wahrscheinlich zusammenfügen und als eine getrennte Zeichenfolge übergeben. Verwenden Sie dann eine [Split-Funktion] (http://stackoverflow.com/questions/697519/split-function-equivalent-in-t-sql) Ihrer Wahl, um sie zu extrahieren. Aber eigentlich würde ich die Zeilen lieber direkt aus Access einfügen. – Andre

+0

@Andre Wie würde ich jeden Teilwert als neuen Datensatz in SQL Server einfügen? Ich denke dabei von vielleicht so etwas wie dies zu tun in Access 'For Each .... Wert in array' ' ausführen gespeichert Globalverfahren 'next' Obwohl ich es fühlen, ist ein viel besserer Weg zu mach das. –

Antwort

0

Verwenden Sie XML, um alle Kundeninformationen in einem Dokument zu übergeben. Auf diese Weise können Sie beliebig viele Parameter übergeben und auf dem Server als Tabelle abfragen.

1

Leider unterstützt AFAIK, VBA keine Tabelle-Wert-Parameter (ADO.NET tut, aber nicht die Vanilla VB6-Implementierung, die wir in Access verwenden müssen).

Sie könnten einen Stream von Funktionsaufrufen an den Server senden, indem Sie ein Recordset oder ähnliches durchlaufen, aber das wird schmerzhaft langsam. Wenn es Ihnen nichts ausmacht, sich selbst zu wiederholen, können Sie einen großen Befehl senden, der eine Reihe von hintereinander verketteten EXEC -Anweisungen enthält (wenn Sie DAO verwenden, geben Sie am Anfang der Abfrage unbedingt SET NOCOUNT ON an).

Wenn Sie sich für eine reine SQL-Lösung suchen, ist hier die Strategie, die ich für diese Art von Problemen nehmen:

  • Concatenate das Array von Werten in einen String mit irgendeiner Art von Trennzeichen (zB“ "oder" | ").
  • Übergeben Sie die Zeichenfolge an eine Funktion oder Abfrage, die es in eine Wertetabelle konvertiert.
  • INSERT oder MERGE die Tabelle der Werte in die endgültige Zieltabelle.

Hier ist ein Beispiel dafür, wie Sie es tun können:

SET NOCOUNT ON 

DECLARE @x XML; 
DECLARE @CreditCards AS TABLE (CreditCardNumber VARCHAR(16)); 
DECLARE @FinalTable AS TABLE (CreditCardNumber VARCHAR(16)); 
DECLARE @CreditCardList AS VARCHAR(8000); 
DECLARE @Divider AS Varchar(10); 

SET @Divider=','; 
SET @CreditCardList='123456789,1111111111111111,2222222222222222,123456789'; 

IF NOT @CreditCardList IS NULL 
    BEGIN 
    SELECT @x = CAST('<A>'+ REPLACE(@CreditCardList,@Divider,'</A><A>')+ '</A>' AS XML); 
    INSERT INTO 
     @CreditCards    
    SELECT 
     t.value('.', 'varchar(16)') AS inVal 
    FROM 
     @x.nodes('/A') AS x(t) ; 
    END 

INSERT INTO 
    @FinalTable 
SELECT 
    CreditCardNumber 
FROM 
    @CreditCards 

SELECT * FROM @FinaLTable 

XML nicht der schnellste Weg ist, um die Konvertierung zu tun, aber es hat den Vorteil, relativ einfach zu sein. Jeff Moden bietet in seinem Blogpost Tally OH! An Improved SQL 8K “CSV Splitter” Function einige ziemlich inspirierte Ansätze für das Problem an.

Hoffe, dass hilft!

Verwandte Themen