次の方法で共有


スクリプト変数で sqlcmd を使用する

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)Microsoft Fabric SQL Database

sqlcmd ユーティリティを使用すると、Transact-SQL ステートメント、システム プロシージャ、スクリプト ファイルを入力できます。

Note

システムにインストールされている sqlcmd のバリアントとバージョンを確認するには、 sqlcmd ユーティリティのインストール済みバージョンを確認するを参照してください。 sqlcmd を取得する方法については、「sqlcmd ユーティリティのダウンロードとインストール」を参照してください。

sqlcmd での変数のスクリプト作成

スクリプトで使用される変数は、スクリプト変数と呼ばれます。 スクリプト変数を使用すると、1 つのスクリプトを複数のシナリオで使用できます。 たとえば、1 つのスクリプトを複数のサーバーに対して実行する場合、各サーバー用にスクリプトを変更するのではなく、サーバー名にスクリプト変数を使用することができます。 サーバー名をスクリプト変数で指定することで、同じスクリプトを複数のサーバーで実行することができるようになります。

スクリプト変数は、 setvar コマンドを使用して明示的に定義することも、 sqlcmd -v オプションを使用して暗黙的に定義することもできます。

この記事には、 SETを使用してコマンド ラインで環境変数を定義する例も含まれています。

setvar コマンドでスクリプト変数を設定する

setvar コマンドは、スクリプト変数を定義します。 setvar コマンドを使用して定義された変数は、内部的に格納されます。 スクリプト変数は、SET を使用してコマンド プロンプトで定義されている環境変数と混同しないようにする必要があります。 スクリプトが環境変数ではない変数を参照している場合、または setvarを使用して定義されていない場合は、エラー メッセージが返され、スクリプトの実行が停止します。 詳細については、「-b」の オプションの説明を参照してください。

変数の優先順位 (低から高)

複数の種類の変数に同じ名前が付いている場合、優先順位の最も高い変数が使用されます。

  1. システム レベル環境変数
  2. ユーザー レベル環境変数
  3. SET X=Y の起動前にコマンド プロンプトで設定されたコマンド シェル ()
  4. sqlcmd -v X=Y
  5. :Setvar X Y

Note

Windows 11 で環境変数を表示するには、[ 設定] を開き、[ System>About] に移動し、[ システム設定の詳細設定 ] リンクを選択します。 [システムのプロパティ] ウィンドウで、[環境変数] を選択 します。 Linux では、コマンド ラインに「 printenv 」と入力し、macOS に「 env」と入力します。

スクリプト変数を暗黙的に設定する

関連する sqlcmd 変数を含むオプションを指定して sqlcmd を起動すると、 sqlcmd 変数には、そのオプションを使用して指定されている値が暗黙的に設定されます。 次の例では、 sqlcmd-l オプションを指定して起動されています。 これにより、SQLLOGINTIMEOUT 変数が暗黙的に設定されます。

sqlcmd -l 60

-v オプションを使用して、スクリプト内に存在するスクリプト変数を設定することもできます。 次のスクリプト (ファイル名は testscript.sql) では、 ColumnName がスクリプト変数です。

USE AdventureWorks2022;

SELECT x.$(ColumnName)
FROM Person.Person x
WHERE x.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 スクリプト変数

変数 関連するオプション R/W 既定値
SQLCMDUSER1 -U R2 ""
SQLCMDPASSWORD1 -P -- ""
SQLCMDSERVER1 -S R2 デフォルトローカルインスタンス
SQLCMDWORKSTATION -H R2 コンピュータ名
SQLCMDDBNAME -d R2 ""
SQLCMDLOGINTIMEOUT -l R/W3 "8" (秒)
SQLCMDSTATTIMEOUT -t R/W3 "0" = 無制限に待機
SQLCMDHEADERS -h R/W3 0
SQLCMDCOLSEP -s R/W3 " "
SQLCMDCOLWIDTH -w R/W3 0
SQLCMDPACKETSIZE -a R2 "4096"
SQLCMDERRORLEVEL -m R/W3 0
SQLCMDMAXVARTYPEWIDTH -y R/W3 "256"
SQLCMDMAXFIXEDTYPEWIDTH -Y R/W3 "0" = 無制限
SQLCMDEDITOR R/W3 "edit.com"
SQLCMDINI R2 ""

1 SQLCMDUSER、SQLCMDPASSWORD および SQLCMDSERVER は、:Connect が使用されるときに設定されます。

2 R は、その値がプログラムの初期化時に一度だけ設定できることを示します。

3 R/W は、 setvar コマンドを使用して値をリセットできることを示し、以降のコマンドでは新しい値を使用します。

この記事のコード サンプルでは、AdventureWorks2022 または AdventureWorksDW2022 サンプル データベースを使用します。このサンプル データベースは、Microsoft SQL Server サンプルとコミュニティ プロジェクト ホーム ページからダウンロードできます。

A. スクリプトで setvar コマンドを使う

多くの sqlcmd オプションは、スクリプトで setvar コマンドを使用して制御できます。 次の例では、スクリプト test.sql が作成されます。このスクリプトでは、変数 SQLCMDLOGINTIMEOUT60 秒に設定され、別のスクリプト変数 servertestserverに設定されています。 test.sqlのコードを次に示します。

:setvar SQLCMDLOGINTIMEOUT 60
:setvar server "testserver"
:connect $(server) -l $(SQLCMDLOGINTIMEOUT)

USE AdventureWorks2022;

SELECT FirstName, LastName
FROM Person.Person;

このスクリプトは、sqlcmd を使用して呼び出されます。

sqlcmd -i c:\test.sql

B: setvar コマンドを対話的に使う

次の例では、 setvar コマンドを使用してスクリプト変数を対話的に設定する方法を示します。

sqlcmd
:setvar MYDATABASE AdventureWorks2022
USE $(MYDATABASE);
GO

結果セットは次のとおりです。

Changed database context to 'AdventureWorks2022'
1>

C: sqlcmd 内でコマンド プロンプト環境変数を使う

次の例では、4 つの環境変数 are を設定した後、sqlcmd から呼び出します。

SET tablename=Person.Person
SET col1=FirstName
SET col2=LastName
SET title=Ms.
sqlcmd -d AdventureWorks2022
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 AdventureWorks2022;

SELECT FirstName
FROM AdventureWorks2022.Person.Person
WHERE BusinessEntityID < 5;

コマンド プロンプトで、次のコードを入力します。

SET MyTempDirectory=%Temp%\output.txt
sqlcmd -i C:\testscript.txt

次の結果が出力ファイル C:\Documents and Settings\<user>\Local Settings\Temp\output.txt に送信されます。

Changed database context to 'AdventureWorks2022'.
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 ファイルが呼び出されます。

SET sqlcmdini=c:\init.sql
sqlcmd

出力結果は次のとおりです。

1> <user> is connected to <server> (9.00.2047.00)

Note

-X オプションを使用すると、スタートアップ スクリプト機能が無効になります。

F. 変数の拡張

次の例では、 sqlcmd 変数の形式でデータを使用する方法を示します。

USE AdventureWorks2022;
GO
CREATE TABLE AdventureWorks2022.dbo.VariableTest (Col1 NVARCHAR(50));
GO

Col1dbo.VariableTest に、値 $(tablename)を含む 1 行を挿入します。

INSERT INTO AdventureWorks2022.dbo.VariableTest (Col1)
VALUES ('$(tablename)');
GO

sqlcmd プロンプトで、$(tablename) と等しい変数が設定されていない場合、次のステートメントでは行が返され、また "'tablename' スクリプト変数が定義されていません" というメッセージも返されます。既定では、sqlcmd フラグ -b は設定されていません。 -b が設定されている場合、sqlcmd は "変数が定義されていません" というエラーの後に終了します。

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