web-dev-qa-db-ja.com

SSMSのSQLCMDモードでファイルの相対パスを取得する方法

テーブルを作成し、データを挿入してからストアドプロシージャを作成する以下のマスタースクリプトがあります。

--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
16
Animesh

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スクリプトが呼び出されたディレクトリからスクリプトが実行されない問題を回避します。

28

これはかなり古いことに気づきましたが、編集済みコードにエラーがありました。パスとスクリプト名の間にバックスラッシュを含める必要があります。

:r $(path)\$(ddl)
:r $(path)\$(dml)
:r $(path)\$(sprocs)
5
DogLimbo

私はこれが最善であることを発見しました:

:setvar path C:\"some path"

:r $(path)\myfile.sql

スペースを含むステートメントは引用符で囲む必要がありますが、ステートメント全体ではありません。それがあなたができる理由ですC:\"some path"

4
Bryce

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

!! PWD

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

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

  1. DOSコマンドを実行してtodo_master.sqlを見つけ、そのファイルへのパスを、SSMSから取得できるフォルダー内のテキストファイルに格納します。 DOSコマンドとSSMSのSQLCMDモードの両方で使用できる環境変数
  2. そのファイルにパスを保存するときは、そのパスに変数を設定するSQLCMDモードコマンドとして保存します。
  3. :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 ...
    
3
Solomon Rutzky

ヘルパーとしてバッチファイルを使用します。

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
0
Jared Beach

私もこれと同じ問題を抱えていたので、明白ではないことを願っています。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
0
Tahir Hassan