同じフォルダーにfoo.sqlとbar.sqlがある場合、:r ".\bar.sql"
を使用してsqlcmdモードでSSDTから実行すると、foo.sqlはbar.sqlを参照できます。ただし、SSMSはそれを検出しません。 Procmonは、SSMSが%systemroot%\syswow64
を探していることを示しています。
パスを明示的に宣言せずに、現在のスクリプトが保存されているフォルダーを検索するようにSSMSに指示するにはどうすればよいですか?
スクリプトを実行していないため、SSMSで相対パスを取得することはそれほど簡単ではありません。 SSMSはスクリプトをメモリにロードし、そのテキストを実行しています。したがって、現在のディレクトリ/フォルダーは、デフォルトのプロセス開始フォルダーです。これは、SSMSのSQLCMDモードで次のコマンドを実行すると確認できます。
!! PWD
しかし、私はこれを行うためのちょっとした方法を見つけました。これはこれを行うための最も理想的な方法ではないことを認めますが、現在はtrue相対パスを取得する唯一の方法のようです(ただし、変数にパスを設定すること自体は、実際には「相対」ではありません)。
だからあなたができることは:
: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 ...
私は間違っているかもしれませんが、それが可能であるとは思いません。他の人が行ったことの例については、これらのリンクを参照してください(どれも理想的ではありません)。
Sqlcmd変数ファイルを 'C:\ Users\your_nt_login_name\AppData\Local\Temp'に保存し、すべてのプロジェクトから$(TEMP)\ sqlcmd_variables.sqlとして参照することをお勧めします。