Wie bringe ich SSMS dazu, den relativen Pfad des aktuellen Skripts mit: r im sqlcmd-Modus zu verwenden, wie dies bei SSDT der Fall ist?


11

Wenn ich foo.sql und bar.sql im selben Ordner habe, kann foo.sql auf bar.sql verweisen, wenn es von SSDT im sqlcmd-Modus mit ausgeführt wird :r ".\bar.sql". SSMS wird es jedoch nicht finden. Procmon zeigt, dass SSMS nachschaut %systemroot%\syswow64:

Kommentierter Procmon-Screenshot

Wie kann ich SSMS anweisen, in dem Ordner zu suchen, in dem das aktuelle Skript gespeichert ist, ohne den Pfad explizit anzugeben?

Antworten:


8

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 Standard-Prozessstartordner. Sie können dies sehen, indem Sie im SQLCMD-Modus in SSMS Folgendes ausführen:

!! PWD

Ich habe jedoch einen Weg gefunden, dies zu tun. Ich gebe zu, dass dies nicht der idealste Weg ist, dies zu tun, aber es scheint derzeit der einzige Weg zu sein, einen echten relativen Pfad zu erhalten (da das Festlegen des Pfads in einer Variablen per se nicht wirklich "relativ" ist ).

Was Sie also tun können, ist:

  1. Führen Sie einen DOS-Befehl aus, um foo.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, die für verfügbar ist sowohl der DOS-Befehl als auch der SQLCMD-Modus in SSMS
  2. Wenn Sie den Pfad in dieser Datei speichern, speichern Sie ihn als SQLCMD-Modusbefehl, der eine Variable für diesen Pfad festlegt
  3. Importieren Sie diese Textdatei mit in SSMS :rund setzen Sie diese Variable auf den gewünschten Pfad
!! CD C:\ & FOR /F %B IN ('DIR /B /A -HS /S foo.sql') DO ECHO :setvar mypath "%~dpB" > %TEMP%\relative_path.txt

:r $(TEMP)\relative_path.txt

:r $(mypath)\bar.sql

Anmerkungen:

  • Bei der obigen Methode wird davon ausgegangen, dass nur eine Datei auf dem System den Namen foo.sql trägt . Wenn mehr als eine Datei diesen Namen hat, ist die zuletzt gefundene der in der Datei relative_path.txt festgelegte Pfad

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

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

Das ist kreativ, aber zu langsam und festplattenintensiv.
Justin Dearing

2
@JustinDearing Wie ich in meiner Antwort sagte, ist es a) nicht ideal und b) langsam, wenn man von einem Stammverzeichnis ausgeht, aber c) der einzige Weg, den ich sehen kann, ist technisch relativ. Ich bin nicht sicher, ob die Indizierung der Festplatte das Leistungsproblem beseitigen würde.
Solomon Rutzky

Obwohl mich das traurig macht, ist dies definitiv die beste Antwort, bei der der Pfad nicht von einem anderen Befehlsskript festgelegt oder fest in die Datei codiert wird.
QueueHammer


2

Ich empfehle, Ihre sqlcmd-Variablendatei unter 'C: \ Users \ your_nt_login_name \ AppData \ Local \ Temp' zu speichern und sie aus allen meinen Projekten als $ (TEMP) \ sqlcmd_variables.sql zu referenzieren.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.