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"

但是,运行此命令时,出现错误,指出“':'附近的语法不正确”。我究竟做错了什么?

Answers:


237

:setvar仅在SQL命令模式下工作,因此您可能处于Management Studio的常规SQL执行范围内,而没有切换到命令模式。

可以通过转到“查询”菜单,然后选择“ SQLCMD模式”,通过SQL Server Management Studio中的用户界面来完成此操作。


19
使用Visual Studio时,这也是一个问题:“数据”>“架构比较”实用程序。如果您从实用程序中运行结果更改脚本,就可以了,但是如果您决定在进行比较后导出/复制更改脚本,然后尝试将结果更改脚本导入/粘贴到SSMS中,则如上所述,它将失败。显然,如果将db change脚本包含在捆绑的部署中,那么这也可能是一个问题。因此,您需要通过上述菜单运行脚本之前打开SQL命令模式,或者确保自定义安装脚本在运行之前这样做。
rism 2012年

6
在Visual Studio(2013)中:“ SQL”菜单->“执行设置”->“ SQLCMD模式”
幼虫

我遇到了这个问题,尝试使用scema比较生成的脚本在安装后首次启动时从我的应用程序构建数据库,并将脚本传递给executenonquery()。我要么需要找到一种通过SQLCMD模式执行此方法的方法,要么会破解脚本以替换所有变量作为开始。
斯科特

仅供参考-我使用发布数据库项目时生成的创建脚本,然后删除了对所有使用setvar引用的变量的引用。我对数据库名称进行了硬编码,因此它不是CREATE DATABASE [$ DatabaseName],而是CREATE DATABASE MYDBNAME。现在,该脚本可在安装后首次启动应用程序时通过executenonquery()创建数据库。
斯科特


2

对于SQL2012:

转到:工具/选项/查询执行,并检查默认情况下,以SQLCMD模式打开新查询。

单击“新建查询”按钮,并确保突出显示了变量定义,脚本现在应该正确运行。

之前的版本:

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


当打开使用:setvar的.sql文件时,Visual Studio还将针对您的项目报告语法错误。此处描述的Options更改将消除错误,并将避免语句中出现“红色波浪状下划线”(您必须关闭并重新打开所有打开的.sql文件才能看到效果)。
BRebey

0

尝试更换 :setvar DatabaseName "MesProduction_Preloaded_KLM_MesSap"

与:

USE [MesProduction_Preloaded_KLM_MesSap]
GO

在脚本的其余部分中对变量的求值没有帮助吗?$(DatabaseName)。[dbo]。[Whatever]
CRice
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.