SQL Server存储过程的条件编译


8

简短版:是否有某种方法可以使用Visual Studio 2010的SQL Server数据工具有条件地编译SQL Server数据项目中的TSQL代码块?

我正在Visual Studio 2010中使用SQL Server数据工具在实验性SQL Server Express数据库上工作。如果一切正常,最终的目标将是企业SQL Server平台。我在一个盒子上有一个2008实例,在另一个盒子上有一个2012实例,因为我的公司也正在从2008年迁移到2012年,以迁移许多企业数据库。

在我使用的其他编程语言中,预处理器指令使按条件编译部分代码库变得容易。最常见的用途是在受限制的部分中为不同的平台使用不同的代码,或者从发行版本中排除调试输出代码

在我正在处理的某些存储过程中,这两个都可能非常有用。有这样的东西吗?我知道我可以sqlcmd在部署过程中使用变量交换特定的值,但是我不知道如何使用它来包含或排除随后的代码块。

例:

#IF $(DebugVersion) = 'True'
    -- A bunch of useful PRINTs and what not
#ELSE
    SET NOCOUNT ON
#ENDIF

#IF $(SSVersion) = '2012'
    SET @pretty_date = FORMAT(@some_date, 'dddd, MMM dd, yyyy')
#ELSE
    SET @pretty_date = CAST(@some_date AS nvarchar(12))
#ENDIF

Answers:


6

不幸的是,我不知道使用SSDT可以做到这一点。

根据项目的规模以及您打算使用2012年好东西提高的程序数量,可以使用Composite Projects对其进行管理。

SSDT可以将数据库项目与一个或多个引用的数据库项目或dacpacs组合在一起,以描述单个组合数据库架构。使用复合项目可以将大型数据库分解为更易于管理的块,允许不同的人员或团队对整个架构的不同部分负责,并可以在多个数据库中重用数据库对象定义。

概念将是拥有一个基础项目,其中包含使用新功能的过程的公共对象定义和特定于版本的项目。2012年的项目将引用基础项目,而编译/构建将合并来自两者的对象。

PITA就是您不能用复合对象替代基础项目中的对象,因此您必须维护基础项目2008和2012。当您想要特定过程的2012版本时,必须将其从基础中删除,并在2008和2012项目中都创建一个版本。


2

我在MSDN上就此需求进行了公开讨论。并没有取得太大进展。理想情况是允许您在基本ssdt项目中将db对象标记为“可继承”,以便引用该基本项目或DAC的其他项目不会抱怨重复的对象,并且仅在以下情况下创建基本对象或“存根”:它不存在。这将使您拥有数据库模型的“层”。请参阅我在msdn上的文章,其中介绍了使用覆盖的存储过程扩展SSDT复合解决方案


2

通过使用预构建事件,我实现了一些接近要求的东西。就我而言,我希望根据构建的配置将不同的用户和登录名包括在部署中。

为此,我为每个用户的每个构建配置创建了一个.sql文件。我将它们标记为“无构建操作”:(我将它们放在项目的子文件夹中)

  • Debug_SomeUser.sql
  • Release_SomeUser.sql

然后,我创建了一个空文件SomeUser.sql(使用Build Action ='Build')。

在预构建事件命令行中:

Copy $(ProjectDir)subfolder\$(Configuration)_Someuser.sql $(ProjectDir)Someuser.sql

令人讨厌的是,一组编码人员不断在git中产生冲突,因此我还添加了预构建命令行

git update-index --assume-unchanged $(ProjectDir)Someuser.sql 

我需要考虑大量的用户和配置,这真是太好了,但是它确实有效。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.