web-dev-qa-db-ja.com

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

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

Annotated Procmon screenshot

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

11
Justin Dearing

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

!! PWD

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

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

  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 ...
    
8
Solomon Rutzky

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

https://stackoverflow.com/questions/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

5
SQL Hammer

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

2