1

使用 SSDT/VS2012/TFS,存储过程被保存为 CREATE 脚本。

我也有数据库引用,我在一些脚本中使用它,例如 select * from [$(MyOtherDatabase)].[dbo].[someTable]

如果我在我的项目中打开一个存储过程并执行它,它会执行 CREATE 脚本,这将出错。此外,$(MyOtherDatabase) 等变量也无法解析。

处理这些问题的最佳方法是什么?

我是否手动将脚本更改为 ALTER?我是否手动将所有变量替换为它们的值?然后当我将该过程重新检入 TFS 时,我是否必须撤消所有这些操作?还是我需要为所有内容发布?

4

2 回答 2

2

问:我是否手动将脚本更改为 ALTER?

不,当您编译和发布项目时,它会自动确定适当的 DDL。

问:我是否手动将所有变量替换为它们的值?

不可以。您可以更改或设置您正在使用的每个配置中的变量值,即 Local、Test、Stage...

问:我需要为所有内容进行发布吗?

当您发布时,它将创建一个脚本或根据您的配置文件将更改直接应用于数据库。您选择将在其中设置目标数据库的配置,然后发布将创建脚本或直接应用更改。所以这取决于你所针对的环境。

如果您使用的是 VSDT 或数据库项目,那么您的部署旨在通过直接编译和发布项目或通过创建的脚本来处理。

如果将 create 语句更改为 alter 语句,您会失去核心功能并错误地使用数据库项目。当您编译您的项目时,它将确定脚本是否应该使用 Create 或 alter DDL 语句,并将根据您部署的目标数据库自动做出此决定。

数据库项目设置

如何:更改目标平台并发布数据库项目

于 2013-04-12T14:13:08.680 回答
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)中操作它们。

于 2013-04-12T13:39:52.090 回答