我在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
任何想法,你的方法是什么?
答案 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)
有一种方法可以做到这一点,但该信息必须首先以:
开头您的对象定义确实需要在所有环境中保持一致。元数据(如在配置数据中)可以是不同的,但不是对象定义。此外,你正在设置自己(更不用说下一个不幸的人接受这个)了。这是不可维护的。使用链接服务器而不使用链接服务器之间在性能,功能和安全性方面存在差异。在您当前的设置中,针对此代码执行的任何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
个语句。