2017-03-21 5 views
1

Ich versuche, einige Daten und feste Zeichen aus einer SQL Server-Tabelle in eine Textdatei zu exportieren. Ich brauche eine große Anzahl solcher Zeilen, die in die Textdatei exportiert werden, so dass ich versuche, eine große Anzahl von Befehlsvariablen zu deklarieren und zu setzen, indem ich sie in eine Zeile setze (das wird die Code-Größe enorm reduzieren). Hier ist, was ich zu tun versucht:xp_cmdshell und echo in sql server trigger

Dies funktioniert:

DECLARE @ClientID varchar(50) 
SET @ClientID = (select ClientID from inserted) 

DECLARE @CommandL1 varchar(512) 
SET @CommandL1 = 'echo U1 '[email protected]+'> c:\temp\file.txt' 
exec master..xp_cmdshell @CommandL1 

Der exakt gleiche Befehl wie oben, jedoch als eine Zeile geschrieben (ohne DECLARE und SET, bevorzugter Weg zu gehen, den Code zu reduzieren) ausfällt (ich erhalte den Fehler - falsche Syntax in der Nähe von (ersten) ‚+‘):

exec master..xp_cmdshell 'echo U1 '[email protected]+'> c:\temp\file.txt' --ERROR 

ich eine Menge Code habe ähnlich wie oben, so auf den Linien sparen möchte. Außerdem würde ich gerne wissen, wie man dieses Problem löst. Vielen Dank für jede Hilfe im Voraus (Ich habe versucht^als Escape-Zeichen, aber keinen Erfolg). Wie ändert man die zweite Zeile (oben gezeigt mit --ERROR), damit es richtig funktioniert?

Jd

+0

Was ist die ClientID? Außerdem, ich denke, Sie haben eine zusätzliche 'in Ihrer ersten Anweisung, die Einstellung von @ CommandL1 – scsimon

+0

Ich bekomme ClientID als SET @ClientID = (wählen Sie ClientID von eingefügt); Dieser Teil funktioniert gut und nach dem Einfügen/Aktualisieren der Tabelle wird die korrekte ClientID mit der ersten Methode in die Textdatei exportiert. Du hattest vollkommen Recht mit Extra '- ich habe es jetzt bearbeitet. Danke für deine Antwort. – Jay

+0

Also 'ClientID' ist ein' INTEGER' oder ist es ein 'VARCHAR'? Sind Sie sicher, dass nur 1 Zeile (record/value) in Ihrer Subselect '(wählen Sie ClientID von eingefügt)'? – scsimon

Antwort

0

Nach MSDN Sie diese Aussage in dynamischem SQL zu halten sind zu haben, so dass die Kommando-Shell nicht

liest
exec master..xp_cmdshell 'echo U1 '[email protected]+'> c:\temp\file.txt' 

als

echo U1 + @ClientID + '> c:\temp\file.txt' 

xp_cmdshell Nimmt einen String-Parameter, so müssen Sie die Zeichenfolge zuerst explizit erstellen, wie Sie es am Anfang getan haben. Der Parameter wird nach dem Endzitat vor dem + beendet, daher ist das + ein Syntaxfehler, da xp_cmdshell nichts anderes erwartet als den String-Parameter NO_OUTPUT als optionalen Parameter. Also interpretiert es Ihr + als einen falschen Parameter.

+0

Vielen Dank. Mehr Arbeit, aber zumindest wird es die Arbeit machen. Ich schätze Ihre Hilfe. – Jay

+0

Kein Problem. Ich habe ein bisschen mehr über die Parameterbeendigung hinzugefügt. Das letzte in SQL wird als das Ende des Zeichenfolgenparameters gelesen. – scsimon