【问题标题】:Practical Development with VS2012, SSDT, and TFS使用 VS2012、SSDT 和 TFS 进行实际开发
【发布时间】:2013-04-05 01:01:03
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: sql-server visual-studio-2012 tfs sql-server-data-tools


    【解决方案1】:

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

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

    问:我是否需要手动将所有变量替换为其值?

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

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

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

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

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

    Database Project Settings

    How to: Change Target Platform and Publish a Database Project

    【讨论】:

    • 那么我怎样才能编辑我的存储过程并将其“应用”到数据库中以便我可以执行它呢?我应该采取哪些步骤来做到这一点?
    • 您将在 SSDT/VS2012 中对表进行更改,它会通知您是否有任何依赖项受更改影响。如果没有,那么你编译项目。如果成功,那么您可以选择部署选项,该选项将再次创建脚本或根据您使用的配置将更改直接应用于目标数据库...调试/发布。查看此链接以获取更多信息以及msdn.microsoft.com/en-us/data/tools.aspx。希望这会有所帮助。
    • 查看我添加的链接以获得答案的帮助
    • 如果您在 VS 中进行更改,然后与您的数据库进行架构比较,您在 VS 中的项目与数据库之间的所有差异都会显示出来。然后,您可以选择要应用于数据库的更改并单击更新。
    • 您是否有一个包含大量表和数据库对象的数据库项目,或者您只是打开一个脚本并需要进行更改并将其应用于数据库?如果没有数据库项目,那么您基本上是在使用 SSMS。如果是数据库项目,则在更改后构建数据库并定位需要更新的数据库并让它应用更改或创建脚本。否则按照@Nighty_ 的建议做一个数据库方案比较并应用更新。
    【解决方案2】:

    你可以试试我对 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) 中操作它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-20
      • 2020-12-19
      相关资源
      最近更新 更多