(コマンドラインからではなく)SSMSでSQLCMDモードを使用する場合、現在のサーバーとインスタンスを変数に割り当てる方法はありますか?これは、通常のTSQL変数の割り当てとは異なります。
問題の定義
SQLCMDの変数拡張機能を使用して、導入した既存のtsql文字列構築マッシュの代わりに、配置スクリプトの環境固有の値を置き換えたいと思います。現在の環境の1つの例外を除いて、SQLCMDを使用してデプロイを処理することは非常にうまくいきました。
--
-- define 2 sqlcmd variables that will be expanded in scripts
--
:setvar dbServer "DEVA2\DEV2"
:setvar dbNotServer @@servername
SELECT
'$(dbServer)' AS hard_coded_value
, @@servername AS [servername]
, '$(dbNotServer)' AS dbNotServer
そして、それは以下の結果を生成します。
hard_coded_value servername dbNotServer
DEVA2\DEV2 DEVA2\DEV2 @@servername
ミートローフは3分の2は悪くないと言っていますが、私は3分の3の解決策を持っていると思います。スクリプトがテストサーバーに展開されたとき、スクリプトの編集を展開担当者に任せたくありません。
SQLCMDを使用するための唯一の解決策がコマンドラインからスクリプトを完全に呼び出すことである場合、私はそれを受け入れることができますが、SQLCMDを使用するのは環境に優しいので、ここでこれを捨てたいと思います。
望ましい出力
:setvar dbNotServer @@servername
SELECT '$(dbNotServer)' AS worked
結果
worked
DEVA\DEV2
実りのない追求
最初のBOLリンクは約束を示しました。私がしなければならなかったのはSQLCMDSERVERを使用することだけでしたが、役に立ちませんでした。SQLSMSモードでSSMSのコンテキスト内で実行すると、致命的なスクリプトエラーがスローされます
-- A fatal scripting error occurred.
-- Variable SQLCMDSERVER is not defined.
SELECT '$(SQLCMDSERVER)' AS [FatalScriptingError]
タンブルウィード更新
2011-08-12答えに基づいて、問題を最も単純な形に減らすために、クエリを単純化しすぎました(私の謝罪)。使用したクエリの一部を以下に示します。2つのレスポンダは、@@ servernameをティックマークでラップすると結果としてリテラル値が得られ、拡張された値を取得するには、引用符からアンラップする必要があります。私の望みは、アンラップを伴う文字列の構築ではなく、sqlcmd変数置換を使用することでした。
INSERT INTO
dbo.SSISCONFIG
(
ConfigurationFilter
, ConfiguredValue
, PackagePath
, ConfiguredValueType
, Application
, Category
, Subcategory
, Comment
)
SELECT
'Default.Accounting' AS ConfigurationFilter
, 'Data Source=$(dbServer);Initial Catalog=Accounting;Provider=SQLNCLI10.1;Integrated Security=SSPI;Packet Size=32767;' AS ConfiguredValue
, '\Package.Connections[Accounting].Properties[ConnectionString]' AS PackagePath
, 'String' AS ConfiguredValueType
, 'Defaults' AS Application
, 'Connection' AS Category
, 'Database' AS Subcategory
, 'Default connection string' AS Comment
SELECT
'Default.$(sqlVersion).CorporateReporting' AS ConfigurationFilter
, 'Data Source=$(dwServer);Initial Catalog=CRDS;Provider=SQLNCLI10.1;Integrated Security=SSPI;Packet Size=32767;' AS ConfiguredValue
, '\Package.Connections[CorporateReporting].Properties[ConnectionString]' AS PackagePath
, 'String' AS ConfiguredValueType
, 'Defaults' AS Application
, 'Connection' AS Category
, 'Database' AS Subcategory
, 'Default connection string' AS Comment
コマンドライン呼び出しは(期待どおりに)機能します
C:\>sqlcmd -E -d master -S DEVA2\DEV2 -Q "SELECT '$(SQLCMDSERVER)' AS [servername]"
SQLCMD変数に格納されているデータベース変数の評価値を取得するために、:setvar x @@ servernameの他の順列を試行して破棄しました。この時点で、クエリのコンパイル前にsqlcmd変数がクエリで代替されていることはほぼ確実ですが、間違っていることが証明されることを望んでいます。