2009-06-10 11 views
1

In einem Projekt, das eine MSSQL 2005-Datenbank verwendet, müssen alle Datenmanipulationsaktionen in einer Protokolltabelle protokolliert werden. Ein Feld in dieser Tabelle sollte die Zeile enthalten, bevor sie geändert wurde. Wir haben eine Menge Tabellen, also habe ich versucht, eine gespeicherte Prozedur zu schreiben, die alle Felder in einer Zeile einer Tabelle, die ihr übergeben wurde, sammelt, sie irgendwie verkettet und dann einen neuen Protokolleintrag mit diesen Informationen schreibt.Verketten von Zeilen aus verschiedenen Tabellen in einem Feld

Ich habe bereits versucht mit FOR XML PATH und es hat funktioniert, aber der Client mag nicht die XML-Notation, sie wollen ein CSV-Feld.

Hier ist, was ich mit FOR XML PATH hatte:

DECLARE @foo varchar(max); 
SET @foo = (SELECT * FROM table WHERE id = 5775 FOR XML PATH('')); 

Die Werte für „Tisch“, „id“ und der tatsächlichen ID (hier: 5775) über den Aufruf der gespeicherten später übergeben würde, Verfahren.

Gibt es eine Möglichkeit, dies ohne XML-Notation zu tun und ohne im Voraus zu wissen, welche Felder von der SELECT-Anweisung zurückgegeben werden?

Antwort

0

Wir haben den XML-Pfad verwendet und wie Sie festgestellt haben, funktioniert es sehr gut. Da eine der Funktionen von SQL darin besteht, XML korrekt zu speichern, macht die CSV keinen Sinn.

Was Sie versuchen könnten, ist ein gespeicherter Proc, der das XML im CSV-Format ausliest (gefälscht). Ich würde. Da Sie die Daten im Vergleich zum Speichern wahrscheinlich nicht so oft lesen werden, ist der Overhead vernachlässigbar.

0

Wie wäre:

Set @Foo = Stuff(
         (Select ',' + MyCol1 + ',' + MyCol2 ... 
          From Table 
          Where Id = 5775 
          For Xml Path('') 
         ), 1, 1, '') 

Diese CSV-Linie produzieren (die innere SQL Annahme gibt eine einzelne Zeile). Nun, das löst den zweiten Teil Ihrer Frage. Was den ersten Teil von "ohne vorherige Kenntnis der Felder" betrifft, gibt es keine Möglichkeit, dies ohne Verwendung von dynamischem SQL zu tun. Das heißt, Sie müssen die SQL-Anweisung als eine Zeichenfolge im laufenden Betrieb erstellen. Wenn Sie das tun, können Sie das gesamte CSV-Ergebnis im Handumdrehen erstellen.

Verwandte Themen