SSDTのように、SSMSでsqlcmdモードの:rを使用して現在のスクリプトの相対パスを使用するにはどうすればよいですか?


11

同じフォルダにfoo.sqlとbar.sqlがある場合、SSSDからsqlcmdモードでを実行すると、foo.sqlはbar.sqlを参照できます:r ".\bar.sql"。ただし、SSMSはそれを検出しません。Procmonは、SSMSが探していることを示しています%systemroot%\syswow64

注釈付きProcmonスクリーンショット

パスを明示的に宣言せずに、現在のスクリプトが保存されているフォルダーを検索するようにSSMSに指示するにはどうすればよいですか?

回答:


8

スクリプトを実行していないので、SSMSで相対パスを取得することはそれほど簡単ではありません。SSMSはスクリプトをメモリにロードし、そのテキストを実行しています。したがって、現在のディレクトリ/フォルダーは、デフォルトのプロセス開始フォルダーです。これは、SSMSのSQLCMDモードで次のコマンドを実行すると確認できます。

!! PWD

しかし、私はこれを行うためのちょっとした方法を見つけました。これはこれを行うための最も理想的な方法ではないことを認めますが、それは現在、真の相対パスを取得する唯一の方法のようです(変数にパスを設定すること自体が実際には「相対」ではない場合) )。

だからあなたができることは:

  1. DOSコマンドを実行してfoo.sqlを見つけ、そのファイルへのパスをSSMSから取得できるフォルダー内のテキストファイルに保存します。これは、ハードコードされたパスであるか、または使用可能な環境変数を使用しているためです。 DOSコマンドとSSMSのSQLCMDモードの両方
  2. そのファイルにパスを保存するときは、そのパスに変数を設定するSQLCMDモードコマンドとして保存します。
  3. を使用:rしてそのテキストファイルをSSMSにインポートすると、その変数が目的のパスに設定されます
!! 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

ノート:

  • 上記の方法では、システム上の1つのファイルのみがfoo.sqlという名前であると想定しています。その名前のファイルが複数ある場合、最後に見つかったファイルは、relative_path.txtファイルに設定されているパスになります。

  • こうCD C:\のルートから開始されますC:ドライブを。これはおそらく、最も効率的な開始点ではありません。通常、SQLファイルがC:\ Users {YourLogin} \ Documents \ Visual Studio 2013 \ Projectsなどの領域にある場合は、CD次のようにコマンドを変更して宛先に近づけます。

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

これはクリエイティブですが、低速でディスクを集中的に使用します。
Justin Dearing、2015

2
@JustinDearing私の回答で述べたように、それはa)非理想的であり、b)ルートディレクトリから開始すると遅くなりますが、c)技術的に相対な方法で実行できる唯一の方法です。ハードドライブにインデックスを付けるとパフォーマンスの問題が解消されるかどうかはわかりません。
ソロモンルツキー

これは私を悲しくさせますが、これは間違いなく最良の答えです。これは、別のコマンドスクリプトからのパスの設定やファイルへのハードコーディングを必要としません。
QueueHammer 2016

5

私は間違っているかもしれませんが、それが可能であるとは思いません。他の人が行ったことの例については、これらのリンクを参照してください(どれも理想的ではありません)。

/programming/8753541/how-to-get-the-relative-path-of-file-in-sqlcmd-mode-in-ssms

http://boardreader.com/thread/Specifying_relative_path_to_r_command_in_lmlz__f0c78408-e001-48a2-8369-338c9534f496.html


よくわかりましたが、SSDTの使用を促進すると思います。
Justin Dearing、2015

2

sqlcmd変数ファイルを 'C:\ Users \ your_nt_login_name \ AppData \ Local \ Temp'に保存し、すべてのプロジェクトから$(TEMP)\ sqlcmd_variables.sqlとして参照することをお勧めします。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.