如果sql数据库项目中的SQLCMD脚本中的条件

时间:2017-03-13 12:23:13

标签: sql-server visual-studio tsql deployment sqlcmd

我在Visual Studio中创建了Sql Server数据库项目,我想知道是否可以使用这样的东西

预部署脚本

:setvar Environment Production

发布部署脚本

IF '$(Environment)' = 'Production'
BEGIN
    ALTER VIEW [dbo].[vwTable]
    AS
        SELECT Col1, Col2 FROM Production.database.dbo.Table1
    GO
END
ELSE
BEGIN
    ALTER VIEW [dbo].[vwTable]
    AS
        SELECT Col2, Col3, Col4 FROM LinkedServer.Development.database.dbo.Table2
    GO
END

错误是:Alter view must be the only statement in the batch.

或更简单的版本

ALTER VIEW [dbo].[vwTable]
AS
IF '$(Environment)' = 'Production'
    SELECT Col1, Col2 FROM Production.database.dbo.Table1
ELSE
    SELECT Col2, Col3, Col4 FROM LinkedServer.Development.database.dbo.Table2
GO

错误是:Incorrect syntax near IF. Expecting Select or With

任何想法,你的方法是什么?

4 个答案:

答案 0 :(得分:1)

你不能把它写成:

ALTER VIEW [dbo].[vwTable] AS SELECT Col1, Col2 FROM $(Environment).database.dbo.Table1 GO

您应该能够控制不同的列,因为我相信命令变量只是在运行之前将文本植入脚本中。

答案 1 :(得分:1)

您应该使用Procedure而不是View作为传递环境的参数。 ALTER VIEW语句必须是批处理的第一个语句,因此您不能以这种方式使用它。即使您以某种方式执行ALTER VIEW语句,您也无法创建VIEW. As a view is a plain T-SQL and cannot understand SQLCMD命令/变量。

程序可能如下所示。

CREATE PROCEDURE [dbo].[usp_Results_Based_On_Environment] (@pEnvironment varchar(50))
AS
BEGIN
    IF @pEnvironment = 'Production'
        SELECT Col1, Col2 FROM Production.database.dbo.Table1
    ELSE
        SELECT Col2, Col3, Col4 FROM LinkedServer.Development.database.dbo.Table2
END
GO

答案 2 :(得分:1)

有一种方法可以做到这一点,但该信息必须首先以:

开头

不要Danger Will Robinson!Danger Will Robinson!这个!!

您的对象定义确实需要在所有环境中保持一致。元数据(如在配置数据中)可以是不同的,但不是对象定义。此外,你正在设置自己(更不用说下一个不幸的人接受这个)了。这是不可维护的。使用链接服务器而不使用链接服务器之间在性能,功能和安全性方面存在差异。在您当前的设置中,针对此代码执行的任何QA都是无效的,因为它甚至不接近在每个环境中测试相同的内容。

但是,可以理解的是,需要处理特定环境的差异。在这种情况下,您应该在每个环境中具有不同的链接服务器定义。在一个或多个环境中不需要链接服务器?没关系,只需创建一个“循环”链接服务器,指向它当前所在的实例。

也就是说,您只需要在EXEC中隐藏需要自己批次的对象的定义,例如:

IF ('$(Environment)' = 'Production')
BEGIN
    EXEC(N'ALTER VIEW [dbo].[vwTable]
           AS
           SELECT Col1, Col2
           FROM Production.database.dbo.Table1;');
END
ELSE
BEGIN
    EXEC(N'ALTER VIEW [dbo].[vwTable]
           AS
           SELECT Col2, Col3, Col4
           FROM LinkedServer.Development.database.dbo.Table2;');
END;

答案 3 :(得分:0)

这不是我想要做的,但它也帮助我解决了这个问题。 可以包含文件,但我需要在发布之前手动注释/取消注释特定行。

:r .\included\production.views.script.sql
--:r .\included\development.views.script.sql

该文件也可以包含许多GO个语句。