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