使用SSDT / VS2012 / TFS,存储过程将保存为CREATE脚本。
我也有数据库引用,我在一些脚本中使用它们 从[$(MyOtherDatabase)]。[dbo]。[someTable]
中选择*如果我在项目中打开存储过程并执行它,它将执行CREATE脚本,这将导致错误输出。此外,诸如$(MyOtherDatabase)之类的变量无法解析。
处理这些问题的最佳方法是什么?
我是否手动将脚本更改为ALTER?我是否手动将所有变量替换为其值?然后当我检查程序回到TFS时,我是否必须撤消所有这些操作?或者我是否需要对所有内容进行发布?
答案 0 :(得分:2)
问:我是否手动将脚本更改为ALTER?
不,当您编译和发布项目时,它将自动确定适当的DDL。
问:我是否手动将所有变量替换为其值?
没有。您可以更改或设置您正在使用的每个配置内的变量值,即Local,Test,Stage ...
问:我是否需要对所有内容进行发布?
发布时,它将创建脚本或根据您的配置文件将更改直接应用于数据库。您选择将在其中设置目标数据库的配置,然后发布将创建脚本或直接应用更改。因此,这取决于您所针对的环境。
如果您正在使用VSDT或数据库项目,那么您的部署旨在通过直接或通过创建的脚本编译和发布项目来处理。
如果将create语句更改为alter语句,则会丢失核心功能并错误地使用数据库项目。编译项目时,它将确定脚本是否应使用Create或alter DDL语句,并将根据您为部署定位的数据库自动做出此决定。
How to: Change Target Platform and Publish a Database Project
答案 1 :(得分:0)
您可以尝试使用UDF的这个技巧。
我在丢弃它们并重新添加它们时遇到了问题(大部分时间我对存储过程的处理方式)。所以我想出了下面的幂等解决方案。
Use [$(DBName)]
GO
:Error $(ErrorOutputFileFromCommandLine)
/*
Create a stubbed version if it does not exist... if it exists, this could shouldn't run, thus not violating permissions
*/
if NOT exists (select * from sysobjects
where id = object_id('dbo.udfMySuperCoolUDF') and sysstat & 0xf = 0)
BEGIN
print 'Creating the stubbed version of dbo.udfMySuperCoolUDF'
EXEC ( 'CREATE FUNCTION dbo.udfMySuperCoolUDF (@i as smallint , @j as smallint ) RETURNS bit AS BEGIN RETURN 0 END')
END
GO
ALTER FUNCTION dbo.udfMySuperCoolUDF (@ValidationLookupCategoryKey smallint , @ValidationLookupKey smallint )
RETURNS bit AS
BEGIN
declare @exists int
select @exists = 0
/* Logic Here */
return @exists
END
第二
研究“sqlcmd”模式。保持$(MyVariable)“按原样”,并学习如何在sqlcmd模式(SSMS内部)和部署(sqlcmd.exe)中操作它们。