it-swarm.com.de

Wie erhalte ich den relativen Dateipfad im SQLCMD-Modus in SSMS?

Ich habe das folgende Hauptskript, das Tabellen erstellt, einige Daten einfügt und dann die gespeicherten Prozeduren erstellt.

--todo_master.sql

use master
go

:r todo_create_ddl.sql
:r todo_create_dml.sql
:r todo_create_sprocs.sql
go

Obwohl sich die Datei todo_master.sql im selben Pfad wie die anderen drei Skripten befindet, kann sie diese drei Skripten nicht finden.

Ich erhalte folgenden Fehler:

A fatal scripting error occurred.
The file specified for :r command was not found.

Wenn ich den vollständigen Pfad wie unten angegeben habe, werden diese Dateien wie vorgesehen gefunden und ausgeführt.

"C:\Docs and Settings\user\My Docs\SSMS\Projects\todo_create_ddl.sql"

Was könnte mir fehlen?


Bearbeiten Wie von Jason vorgeschlagen, habe ich dies versucht, aber immer noch den gleichen Fehler erhalten:

use master
go

:setvar path "C:\Documents and Settings\user\My Documents\SQL Server Management Studio\Projects"
:setvar ddl "todo_create_ddl.sql"
:setvar dml "todo_create_dml.sql"
:setvar sprocs "todo_create_sprocs.sql"

:r $(path)$(ddl)
:r $(path)$(dml)
:r $(path)$(sprocs)
go
14
Animesh

Sie können dies umgehen, indem Sie die Option sqlcmd setvar verwenden, um den Pfad einer Variablen zuzuweisen. Verwenden Sie dann diese Variable in Ihrem :r-Aufruf wie folgt:

:setvar path "c:\some path"
:r $(path)\myfile.sql

Dieser Link enthält ein ausführlicheres Beispiel: http://www.simple-talk.com/sql/sql-tools/the-sqlcmd-workbench/

Mit dieser Option können Sie die setvar-Zeile entfernen und diese von der Kommandozeile übergeben mit:

Sqlcmd /Sserver /E -ddatabase -iInputfilename -oOutputfilename -v path=c:\somepath

Dies würde das Problem umgehen, dass das Skript nicht in dem Verzeichnis ausgeführt wird, in dem das erste SQL-Skript aufgerufen wurde.

25

Mir ist klar, dass dies ziemlich alt ist, aber ich habe einen Fehler in Ihrem bearbeiteten Code festgestellt: Sie müssen einen Backslash zwischen dem Pfad und dem Skriptnamen einfügen.

:r $(path)\$(ddl)
:r $(path)\$(dml)
:r $(path)\$(sprocs)
5
DogLimbo

Ich habe festgestellt, dass dies das Beste wäre:

:setvar path C:\"some path"

:r $(path)\myfile.sql

Sie müssen Anweisungen in Anführungszeichen setzen, aber nicht die gesamte Anweisung. Deshalb kannst du C:\"some path"

4
Bryce

Das Abrufen eines relativen Pfads in SSMS ist nicht so einfach, da Sie das Skript nicht ausführen. SSMS hat das Skript in den Speicher geladen und führt seinen Text aus. Das aktuelle Verzeichnis/der aktuelle Ordner ist also der Standardprozess-Startordner. Sie können dies sehen, indem Sie Folgendes im SQLCMD-Modus in SSMS ausführen:

!! PWD

Allerdings habe ich eine Art Möglichkeit gefunden, dies zu tun. Ich gebe zu, dass dies nicht der beste Weg ist, dies zu tun, aber derzeit scheint es der einzige Weg zu sein, einen true relativen Pfad zu erhalten (vorausgesetzt, dass das Setzen des Pfades in einer Variablen nicht der Fall ist wirklich "relativ" per se).

Was Sie also tun können, ist:

  1. Führen Sie einen DOS-Befehl aus, um todo_master.sql zu finden und den Pfad zu dieser Datei in einer Textdatei in einem Ordner zu speichern, den Sie von SSMS erhalten können, entweder weil es sich um einen fest codierten Pfad handelt oder weil eine Umgebungsvariable verwendet wird Dies steht sowohl dem DOS-Befehl als auch dem SQLCMD-Modus in SSMS zur Verfügung
  2. Speichern Sie den Pfad in dieser Datei als SQLCMD-Befehl, der eine Variable auf diesen Pfad setzt
  3. Importieren Sie diese Textdatei mit :r in SSMS und setzen Sie diese Variable auf den gewünschten Pfad
!! CD C:\ & FOR /F %B IN ('DIR /B /A -HS /S todo_master.sql') DO ECHO :setvar mypath "%~dpB" > %TEMP%\relative_path.txt

:r $(TEMP)\relative_path.txt

:r $(mypath)\todo_create_ddl.sql
GO
:r $(mypath)\todo_create_dml.sql
GO
:r $(mypath)\todo_create_sprocs.sql
GO

Anmerkungen:

  • Die obige Methode setzt voraus, dass nur 1 Datei auf dem System den Namen todo_master.sql hat. Wenn mehr als eine Datei diesen Namen hat, ist der zuletzt gefundene der in der Datei relative_path.txt festgelegte Pfad

  • Der CD C:\ beginnt im Stammverzeichnis des Laufwerks C: . Dies ist wahrscheinlich nicht der effizienteste Ort, um zu beginnen. Wenn sich Ihre SQL-Dateien im Allgemeinen in einem Bereich wie C:\Users {YourLogin}\Documents\Visual Studio 2013\Projects befinden, ändern Sie einfach den Befehl CD, um näher an das Ziel heranzukommen, z.

    !! CD C:\Users\{YourLogin}\Documents\Visual Studio 2013 & FOR ...
    
3
Solomon Rutzky

Verwenden Sie eine Batchdatei als Helfer.

Ändern Sie todo_master.sql, um eine Umgebungsvariable mit dem Namen mypath zu verwenden:

use master
go 
:r $(mypath)\todo_create_ddl.sql
:r $(mypath)\todo_create_dml.sql
:r $(mypath)\todo_create_sprocs.sql
go

Und in Ihrer Batch-Datei todo_master.bat

/* set the environment variable to the current directory */
SET mypath=%cd%
/* run your sql command */
sqlcmd -i todo_master.sql
0
Jared Beach

Ich selbst hatte das gleiche Problem und hoffe, dass ich nicht das Offensichtliche wiedergebe - warum nicht eine Dos/Cmd- oder PowerShell-Instanz, cd, in das Verzeichnis öffnen, das die Skripte enthält, und dann Management Studio von dort laden?

Ich habe diesen Alias ​​in meiner PowerShell-Einrichtung (Ihr Pfad kann abweichen):

Set-Alias -Name 'Ssms' -Value "${env:ProgramFiles(x86)}\Microsoft SQL Server\120\Tools\Binn\ManagementStudio\Ssms.exe" 

Ich cd dann zu dem Ordner, der die Lösungsdatei enthält, dann mache ich

Ssms mysolution.ssmssln
0
Tahir Hassan