mithilfe von BCP zum exportieren von gespeicherten Prozedur-Ergebnis in SQL Server 2008
Heyy,
Ich versuche, BCP zum exportieren einer SP Ergebnis in eine text-Datei mit dieser Abfrage:
EXEC xp_cmdshell 'bcp "exec asmary..usp_Contract_SelectByEmpId -1,1" queryout "C:\test.txt" -w -C OEM -t$ -T -r ~ -S heba\HEBADREAMNET '
Die Ausgabe dieser Abfrage wird sagen, dieser Fehler:
Fehler = [Microsoft][SQL Server Native Client 10.0][SQL Server]Falsche syntax bei das Schlüsselwort 'where'.
dachte sogar, ich bin mir sicher, dass die gespeicherte Prozedur "usp_Contract_SelectByEmpId" arbeitet korrekt.
Jemand konfrontiert, dass Art von Fehler vor?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Als Lynn schlug vor, überprüfen Sie Ihre gespeicherten Prozedur. Es sieht aus wie das Problem innerhalb dass.
Sicherzustellen, dass alle plain-ausgewählte Werke (z.B. Laufwerk C: ist Datenbank-server-lokalen Laufwerk, nicht unbedingt Ihre eigenen lokalen Laufwerk).
Wenn die ersten beiden Elemente funktionieren gut, fügen Sie dann SET FMTONLY OFF wie folgt:
EXEC xp_cmdshell 'bcp "set fmtonly off exec asmary..usp_Contract_SelectByEmpId -1,1" queryout "C:\test.txt" -w -C Soem -t$ -T -r ~ -S heba\HEBADREAMNET'
Ich muss zugeben, dass, wenn ich habe versucht, ähnliches auf meinem Rechner scheiterte es mit 'Function Sequenz Fehler', und ich fand, dass es in Bezug auf einen SQL Server 2008 behoben 2011.
Bitte beachten Sie auch, dass auch ohne SET FMTONLY OFF funktioniert alles mit BCP library (odbcbcp.dll odbcbcp.lib). Ja, Sie haben viel mehr generische ODBC-Breite bcp-Lösung, wenn Sie schreiben Ihre eigenen wrapper ausführbar (beispielsweise in C oder C++).
Fand ich auch Folgendes an http://msdn.microsoft.com/en-us/library/ms162802.aspx
Kann die Abfrage auf eine gespeicherte Prozedur verweisen, solange alle Tabellen verwiesen wird, die innerhalb der gespeicherten Prozedur vorhanden ist, vor der Ausführung der bcp-Anweisung. Zum Beispiel, wenn die gespeicherte Prozedur eine temporäre Tabelle generiert, die die bcp-Anweisung fehl, da die temporäre Tabelle nur zur Laufzeit und nicht bei der Ausführung der Anweisung Zeit. In diesem Fall erwägen Sie, die Ergebnisse der gespeicherten Prozedur in eine Tabelle und verwenden Sie bcp, um die Daten zu kopieren aus der Tabelle in eine Datendatei.
Bitte beachten Sie auch meine separate Antwort - ich denke, das ganze Konzept der Verwendung der gespeicherten Prozedur für BCP/queryout ist falsch.
Versuchen.
Sorry für die überflutung Ihrer Frage mit mehreren Antworten, aber ich wollte herausfinden, wie viel schwerer (performance-wise) die Verwendung der gespeicherten Prozedur ist im Vergleich zu plain WÄHLEN. Und ich habe eine sehr wichtige information aus
http://social.msdn.microsoft.com/Forums/en-US/transactsql/thread/b8340289-7d7e-4a8d-b570-bec7a0d73ead/
Diese gezwungen, mich um einen anderen (separaten) Antwort. Der Beitrag ich mich beziehe, gilt das ganze Konzept.
In wenigen Worten: die gespeicherte Prozedur aufgerufen werden kann mehrere (3) Zeiten, um herauszufinden, die Struktur der Ergebnismenge, dann die eigentlichen Daten.
Deshalb (und vor allem, wenn der Aufruf aus SQL Server-Verbindung eher als client), ich denke, es macht viel mehr Sinn, um eine gespeicherte Prozedur oder Funktion, die Sie im return SELECT-Anweisung. Dann können Sie eine generische gespeicherte Prozedur oder eine Funktion zum erstellen und ausführen von vollständigen Befehl BCP mit dieser Aussage eingebettet ist. Ich bin mir ziemlich sicher, dass in diesem Fall BCP verwenden könnte, einen viel besseren Ausführungsplan. Leider, ich kann nicht bestätigen, dass in der Praxis, weil BCP-Fehler in SQL Server 2008 R2 habe ich erwähnt in meinem vorherigen post.
N. B. Bitte achten Sie auf die Erstellung von dynamischen Abfragen und die Flucht alle expliziten Zeichenketten (d.h. wiederholen Sie alle einfachen Anführungszeichen zweimal), um zu vermeiden berüchtigten SQL-injection. Leider gibt es ein anderes Problem: Sie sollten sicherstellen, dass Sie nicht entkommen Ihre Fragen doppelt oder mehrmals.