SQL Server ':setvar'エラー


123

次のように、T-SQLでいくつかのスクリプト変数を作成しようとしています。

    /*
    Deployment script for MesProduction_Preloaded_KLM_MesSap
    */

    GO
    SET ANSI_NULLS, ANSI_PADDING, ANSI_WARNINGS, ARITHABORT, CONCAT_NULL_YIELDS_NULL, QUOTED_IDENTIFIER ON;

    SET NUMERIC_ROUNDABORT OFF;


    GO
    :setvar DatabaseName "MesProduction_Preloaded_KLM_MesSap"

しかし、これを実行すると、「:の近くに不正な構文があります」というエラーが表示されます。何が悪いのですか?

回答:


237

:setvarはSQLコマンドモードでのみ機能するため、Management Studioで通常のSQL実行の範囲内にあり、コマンドモードに切り替えられていません。

これは、SQL Server Management Studioのユーザーインターフェイスから[クエリ]メニューに移動し、[SQLCMDモード]を選択して実行できます。


19
これは、Visual Studioの[データ]> [スキーマ比較]ユーティリティを使用する場合の問題でもあります。ユーティリティ内から結果の変更スクリプトを実行する場合は問題ありませんが、比較後に変更スクリプトをエクスポート/ xcopyし、結果の変更スクリプトをSSMSにインポート/貼り付けしようとすると、上記のように失敗します。バンドルされたデプロイメントにdb変更スクリプトを含めた場合、明らかにこれが問題になる可能性もあります。したがって、上記のメニューからスクリプトを実行する前に、SQLコマンドモードをオンにするか、カスタムインストールスクリプトを実行する前にオンにする必要があります。
rism

6
Visual Studio(2013)の場合:SQLメニュー
2015年

scema compareで生成されたスクリプトを使用して、インストール後の最初の起動時にアプリケーションからデータベースを構築し、executenonquery()にスクリプトを渡して、この問題に遭遇しています。SQLCMDモードでこれを実行する方法を見つけるか、最初にすべての変数を置き換えるスクリプトをハックアップする必要があります。
スコット

参考までに-私は自分のDBプロジェクトの公開から生成された作成スクリプトを使用してから、setvarを使用して参照される変数への参照をすべて削除しました。データベース名をハードコーディングしたので、CREATE DATABASE [$ DatabaseName]ではなく、単にCREATE DATABASE MYDBNAMEになりました。このスクリプトは、インストール後の最初のアプリケーション起動時に、executenonquery()を介してデータベースを作成するように機能します。
スコット


2

SQL2012の場合:

:tools / options / Query Executionに移動して、デフォルトでチェックし、SQLCMDモードで新しいクエリを開きます。

[新しいクエリ]ボタンをクリックして、変数の定義が強調表示されていることを確認します。これで、スクリプトが正しく実行されるはずです。

以前のバージョン:

http://blog.sqlauthority.com/2013/06/28/sql-server-how-to-set-variable-and-use-variable-in-sqlcmd-mode/


Visual Studioは、:setvarを使用する.sqlファイルが開いているときに、プロジェクトに対して構文エラーも報告します。ここで説明するオプションの変更により、エラーがなくなり、ステートメントの「赤い波線」が表示されなくなります(効果を確認するには、開いている.sqlファイルを閉じてから再度開く必要があります)。
BRebey

0

交換してみてください :setvar DatabaseName "MesProduction_Preloaded_KLM_MesSap"

と:

USE [MesProduction_Preloaded_KLM_MesSap]
GO

スクリプトの残りの部分での変数の評価に役立ちませんか?$(DatabaseName)。[dbo]。[Whatever]
CRice
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.