スクリプトで使用される変数は、スクリプト変数と呼ばれます。 スクリプト変数を使用すると、1 つのスクリプトを複数のシナリオで使用できます。 たとえば、1 つのスクリプトを複数のサーバーに対して実行する場合、各サーバー用にスクリプトを変更するのではなく、サーバー名にスクリプト変数を使用することができます。 サーバー名をスクリプト変数で指定することで、同じスクリプトを複数のサーバーで実行することができるようになります。
スクリプト変数は 、setvar コマンドを使用して明示的に定義することも、 sqlcmd-v オプションを使用して暗黙的に定義することもできます。
このトピックには、 SETを使用して Cmd.exe コマンド プロンプトで環境変数を定義する例も含まれています。
setvar コマンドを使用したスクリプト変数の設定
setvar コマンドは、スクリプト変数を定義するために使用されます。 setvar コマンドを使用して定義された変数は、内部的に格納されます。 スクリプト変数は、 SETを使用してコマンド プロンプトで定義された環境変数と混同しないでください。 スクリプトが環境変数ではない変数を参照している場合、または setvar を使用して定義されていない場合は、エラー メッセージが返され、スクリプトの実行が停止します。 詳細については、sqlcmd ユーティリティの -b オプションを参照してください。
変数の優先順位 (低から高)
複数の種類の変数に同じ名前が付いている場合、優先順位の最も高い変数が使用されます。
システム レベル環境変数
ユーザー レベル環境変数
sqlcmd を開始する前にコマンド プロンプトで設定されたコマンド シェル (SET X=Y)
sqlcmd-v X=Y
:Setvar X Y
Note
環境変数を表示するには、コントロール パネルでシステムを開き、[詳細設定] タブをクリックします。
スクリプト変数の暗黙的な設定
関連する sqlcmd 変数を含むオプションを指定して sqlcmd を起動すると、 sqlcmd 変数には、そのオプションを使用して指定されている値が暗黙的に設定されます。 次の例では、 sqlcmd が -l オプションを指定して起動されています。 これにより、SQLLOGINTIMEOUT 変数が暗黙的に設定されます。
c:\> sqlcmd -l 60
v オプションを使用して、スクリプトに存在するスクリプト変数を設定することもできます。 次のスクリプト (ファイル名は testscript.sql) では、 ColumnName がスクリプト変数です。
USE AdventureWorks2012;
SELECT x.$(ColumnName)
FROM Person.Person x
WHERE c.BusinessEntityID < 5;
その後、 -v オプションを使用して、取得する列の名前を指定できます。
sqlcmd -v ColumnName ="FirstName" -i c:\testscript.sql
同じスクリプトを使用して別の列を取得するには、 ColumnName スクリプト変数の値を変更します。
sqlcmd -v ColumnName ="LastName" -i c:\testscript.sql
変数名と値のスクリプト作成のガイドライン
スクリプト変数に名前を指定する場合は、次のガイドラインを考慮してください。
変数名には空白文字または引用符を使用できません。
変数名には、 $(var) のような変数式と同じ形式を使用することはできません。
スクリプト変数では、大文字と小文字が区別されません。
Note
sqlcmd 環境変数に値が割り当てられていない場合、この変数は削除されます。 値を指定せずに :setvar VarName を使用すると、変数がクリアされます。
スクリプト変数に値を指定する場合は、次のガイドラインを考慮してください。
文字列値にスペースが含まれている場合は、 setvar または -v オプションを使用して定義された変数値を引用符で囲む必要があります。
変数値に引用符が使用されている場合は、その引用符をエスケープする必要があります。 たとえば、
setvar MyVar "spac""e"のように指定します。
Cmd.exe SET 変数名と名前のガイドライン
SETを使用して定義された変数は、Cmd.exe 環境の一部であり、sqlcmd で参照できます。 次のガイドラインを考慮してください。
変数名には空白文字または引用符を使用できません。
変数の値には、スペースまたは引用符を含めることができます。
sqlcmd スクリプト変数
sqlcmd によって定義される変数は、スクリプト変数と呼ばれます。 次の表に、 sqlcmd スクリプト変数の一覧を示します。
| Variable | 関連オプション | R/W | Default |
|---|---|---|---|
| SQLCMDUSER* | -U | R | "" |
| SQLCMDPASSWORD* | -P | -- | "" |
| SQLCMDSERVER* | -S | R | "DefaultLocalInstance" |
| SQLCMDWORKSTATION | -H | R | "ComputerName" |
| SQLCMDDBNAME | -D | R | "" |
| SQLCMDLOGINTIMEOUT | -l | R/W | "8" (秒) |
| SQLCMDSTATTIMEOUT | -T | R/W | "0" = 無制限に待機 |
| SQLCMDHEADERS | -h | R/W | "0" |
| SQLCMDCOLSEP | -S | R/W | " " |
| SQLCMDCOLWIDTH | -W | R/W | "0" |
| SQLCMDPACKETSIZE | -a | R | "4096" |
| SQLCMDERRORLEVEL | -m | R/W | "0" |
| SQLCMDMAXVARTYPEWIDTH | -y | R/W | "256" |
| SQLCMDMAXFIXEDTYPEWIDTH | -Y | R/W | "0" = 無制限 |
| SQLCMDEDITOR | R/W | "edit.com" | |
| SQLCMDINI | R | "" |
* :Connect を使用すると、SQLCMDUSER、SQLCMDPASSWORD、および SQLCMDSERVER が設定されます。
R は、プログラムの初期化中に値を 1 回だけ設定できることを示します。
R/W は 、setvar コマンドを使用して値をリセットできることを示し、以降のコマンドでは新しい値を使用します。
Examples
A. スクリプトでの setvar コマンドの使用
多くの sqlcmd オプションは、スクリプトで setvar コマンドを使用して制御できます。 次の例では、スクリプト test.sql が作成されます。このスクリプトでは、変数 SQLCMDLOGINTIMEOUT が 60 秒に設定され、別のスクリプト変数 serverが testserverに設定されています。
test.sqlのコードを次に示します。
:setvar SQLCMDLOGINTIMEOUT 60
:setvar server "testserver"
:connect $(server) -l $(SQLCMDLOGINTIMEOUT)
USE AdventureWorks2012;
SELECT FirstName, LastName
FROM Person.Person;
The script is then called by using sqlcmd:
sqlcmd -i c:\test.sql
B. setvar コマンドを対話形式で使用する
次の例では、 setvar コマンドを使用してスクリプト変数を対話的に設定する方法を示します。
sqlcmd
:setvar MYDATABASE AdventureWorks2012
USE $(MYDATABASE);
GO
結果セットは次のようになります。
Changed database context to 'AdventureWorks2012'
1>
C. sqlcmd 内でのコマンド プロンプト環境変数の使用
次の例では、4 つの環境変数 are 設定され、 sqlcmdから呼び出されます。
C:\>SET tablename=Person.Person
C:\>SET col1=FirstName
C:\>SET col2=LastName
C:\>SET title=Ms.
C:\>sqlcmd -d AdventureWorks2012
1> SELECT TOP 5 $(col1) + ' ' + $(col2) AS Name
2> FROM $(tablename)
3> WHERE Title ='$(title)'
4> GO
D. sqlcmd 内でのユーザー レベルの環境変数の使用
次の例では、ユーザー レベルの環境変数 %Temp% がコマンド プロンプトで設定され、 sqlcmd 入力ファイルに渡されます。 ユーザーレベル環境変数を取得するには、 [コントロール パネル] の [システム] をダブルクリックします。 [ 詳細設定 ] タブをクリックし、[ 環境変数] をクリックします。
入力ファイル c:\testscript.txtのコードを次に示します。
:OUT $(MyTempDirectory)
USE AdventureWorks2012;
SELECT FirstName
FROM AdventureWorks2012.Person.Person
WHERE BusinessEntityID
< 5;
コマンド プロンプトで、次のコードを入力します。
C:\ >SET MyTempDirectory=%Temp%\output.txt
C:\ >sqlcmd -i C:\testscript.txt
次の結果は、出力ファイル C:\Documents and Settings\<user>\Local Settings\Temp\output.txtに送信されます。
Changed database context to 'AdventureWorks2012'.
FirstName
--------------------------------------------------
Gustavo
Catherine
Kim
Humberto
(4 rows affected)
E. スタートアップ スクリプトの使用
sqlcmd スタートアップ スクリプトは、 sqlcmd の起動時に実行されます。 次の例では、環境変数 SQLCMDINIが設定されます。 以下の内容を次に示します: init.sql.
SET NOCOUNT ON
GO
DECLARE @nt_username nvarchar(128)
SET @nt_username = (SELECT rtrim(convert(nvarchar(128), nt_username))
FROM sys.dm_exec_sessions WHERE spid = @@SPID)
SELECT @nt_username + ' is connected to ' +
rtrim(CONVERT(nvarchar(20), SERVERPROPERTY('servername'))) +
' (' +
rtrim(CONVERT(nvarchar(20), SERVERPROPERTY('productversion'))) +
')'
:setvar SQLCMDMAXFIXEDTYPEWIDTH 100
SET NOCOUNT OFF
GO
:setvar SQLCMDMAXFIXEDTYPEWIDTH
次のコードにより、 init.sql の起動時に sqlcmd ファイルが呼び出されます。
C:\> SET sqlcmdini=c:\init.sql
>1 Sqlcmd
出力結果は次のとおりです。
>1 < user > is connected to < server > (9.00.2047.00)
Note
-X オプションを指定すると、スタートアップ スクリプト機能が無効になります。
F. 変数の展開
次の例では、 sqlcmd 変数の形式でデータを使用する方法を示します。
USE AdventureWorks2012;
CREATE TABLE AdventureWorks2012.dbo.VariableTest
(
Col1 nvarchar(50)
);
GO
Col1 の dbo.VariableTest に、値 $(tablename)を含む 1 行を挿入します。
INSERT INTO AdventureWorks2012.dbo.VariableTest(Col1)
VALUES('$(tablename)');
GO
sqlcmdプロンプトで、$(tablename)と等しい変数が設定されていない場合、次のステートメントは行を返します。
C:\> sqlcmd
>1 SELECT Col1 FROM dbo.VariableTest WHERE Col1 = '$(tablename)';
>2 GO
>3 SELECT Col1 FROM dbo.VariableTest WHERE Col1 = N'$(tablename)';
>4 GO
結果セットは次のようになります。
>1 Col1
>2 ------------------
>3 $(tablename)
>4
>5 (1 rows affected)
変数 MyVar が $(tablename)に設定されている場合は次のようになります。
>6 :setvar MyVar $(tablename)
次のステートメントでは、行だけでなく、"'tablename' スクリプト変数が定義されていません。" というメッセージも返されます。
>6 SELECT Col1 FROM dbo.VariableTest WHERE Col1 = '$(tablename)';
>7 GO
>1 SELECT Col1 FROM dbo.VariableTest WHERE Col1 = N'$(tablename)';
>2 GO
次のステートメントでは行が返されます。
>1 SELECT Col1 FROM dbo.VariableTest WHERE Col1 = '$(MyVar)';
>2 GO
>1 SELECT Col1 FROM dbo.VariableTest WHERE Col1 = N'$(MyVar)';
>2 GO
こちらもご覧ください
sqlcmd ユーティリティを使用する
sqlcmd ユーティリティ
コマンド プロンプト ユーティリティ リファレンス (データベース エンジン)