テーブルを作成し、データを挿入してからストアドプロシージャを作成する以下のマスタースクリプトがあります。
--todo_master.sql
use master
go
:r todo_create_ddl.sql
:r todo_create_dml.sql
:r todo_create_sprocs.sql
go
ただし、todo_master.sqlが他の3つのスクリプトと同じパスにある場合でも、これらの3つのスクリプトを見つけることはできません。
次のエラーが発生します。
A fatal scripting error occurred.
The file specified for :r command was not found.
以下のように完全なパスを指定すると、これらのファイルが意図したとおりに見つかり、実行されます。
"C:\Docs and Settings\user\My Docs\SSMS\Projects\todo_create_ddl.sql"
何が欠けているのでしょうか?
編集 Jasonの提案に従ってこれを試しましたが、同じエラーが発生します。
use master
go
:setvar path "C:\Documents and Settings\user\My Documents\SQL Server Management Studio\Projects"
:setvar ddl "todo_create_ddl.sql"
:setvar dml "todo_create_dml.sql"
:setvar sprocs "todo_create_sprocs.sql"
:r $(path)$(ddl)
:r $(path)$(dml)
:r $(path)$(sprocs)
go
Sqlcmd setvar
オプションを使用してパスを変数に割り当てることで、これを回避できます。次に、その変数を:r
呼び出しで次のように使用します。
:setvar path "c:\some path"
:r $(path)\myfile.sql
このリンクには、より詳細な例があります: http://www.simple-talk.com/sql/sql-tools/the-sqlcmd-workbench/
これを実行すると、setvar行を削除して、コマンドラインから次のように渡すことができます。
Sqlcmd /Sserver /E -ddatabase -iInputfilename -oOutputfilename -v path=c:\somepath
これは、最初のSQLスクリプトが呼び出されたディレクトリからスクリプトが実行されない問題を回避します。
これはかなり古いことに気づきましたが、編集済みコードにエラーがありました。パスとスクリプト名の間にバックスラッシュを含める必要があります。
:r $(path)\$(ddl)
:r $(path)\$(dml)
:r $(path)\$(sprocs)
私はこれが最善であることを発見しました:
:setvar path C:\"some path"
:r $(path)\myfile.sql
スペースを含むステートメントは引用符で囲む必要がありますが、ステートメント全体ではありません。それがあなたができる理由ですC:\"some path"
スクリプトを実行していないので、SSMSで相対パスを取得することはそれほど簡単ではありません。 SSMSはスクリプトをメモリにロードし、そのテキストを実行しています。したがって、現在のディレクトリ/フォルダーは、デフォルトのプロセス開始フォルダーです。これは、SSMSのSQLCMDモードで以下を実行することで確認できます。
!! PWD
しかし、私はこれを行うためのちょっとした方法を見つけました。これはこれを行うための最も理想的な方法ではないことを認めますが、現在はtrue相対パスを取得する唯一の方法のようです(パスを変数に設定すること自体は、実際には「相対的」ではありません)。
だからあなたができることは:
:r
を使用してそのテキストファイルをSSMSにインポートすると、その変数が目的のパスに設定されます!! CD C:\ & FOR /F %B IN ('DIR /B /A -HS /S todo_master.sql') DO ECHO :setvar mypath "%~dpB" > %TEMP%\relative_path.txt
:r $(TEMP)\relative_path.txt
:r $(mypath)\todo_create_ddl.sql
GO
:r $(mypath)\todo_create_dml.sql
GO
:r $(mypath)\todo_create_sprocs.sql
GO
ノート:
上記の方法は、システム上の1つのファイルのみがtodo_master.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 ...
ヘルパーとしてバッチファイルを使用します。
Todo_master.sqlを変更して、mypath
という環境変数を使用します。
use master
go
:r $(mypath)\todo_create_ddl.sql
:r $(mypath)\todo_create_dml.sql
:r $(mypath)\todo_create_sprocs.sql
go
バッチファイルtodo_master.bat
/* set the environment variable to the current directory */
SET mypath=%cd%
/* run your sql command */
sqlcmd -i todo_master.sql
私もこれと同じ問題を抱えていたので、明白ではないことを願っています。Dos/ CmdまたはPowerShellインスタンスを開いて、スクリプトを含むディレクトリにcd
を開き、そこからManagement Studioをロードしてみませんか?
PowerShellセットアップにこのエイリアスがあります(パスは異なる場合があります)。
Set-Alias -Name 'Ssms' -Value "${env:ProgramFiles(x86)}\Microsoft SQL Server\120\Tools\Binn\ManagementStudio\Ssms.exe"
次に、ソリューションファイルを含むフォルダーにcd
し、次に
Ssms mysolution.ssmssln