我正在try 使用SQL Server数据库项目来保存我们所有的表、存储过程、视图等脚本.我现在想要一种方法,能够同时保留我们所有的参考(静电)数据.当工具或项目运行时,它将安装所有DB对象并插入所有引用数据.

我在VS2010上找到了类似的文章,但它们使用的是数据库专业人士的Team Edition之类的东西.

  • 让我们的数据库处于源代码控制之下.
  • 将本地开发数据库与源代码管理的最新版本同步.
  • 使用Visual Studio 2012和SQL Server 2012
  • 尽可能使用.Net工具,而不是像Redgate那样的工具(Redgate很棒,但是如果我可以在VS2012中使用工具的话,我还不想放弃它)

推荐答案

您可以使用此方法:

  • 将参考数据放入XML文件中,每个表一个
  • 将包含引用数据的XML文件添加到数据库项目
  • 使用部署后脚本从XML中提取数据并将其合并到表中

下面是对每个步骤的更详细描述,并用一个例子加以说明.假设您需要初始化一个具有以下 struct 的国家表:

create table Country (
    CountryId uniqueidentifier NOT NULL,
    CountryCode varchar(2) NOT NULL,
    CountryName varchar(254) NOT NULL
)

在数据库项目下创建一个名为ReferenceData的新文件夹.它应该是Schema ObjectsScripts的sibling 文件夹.

将名为Country.xml的新XML文件添加到ReferenceData文件夹.按如下方式填充文件:

<countries>
    <country CountryCode="CA" CountryName="Canada"/>
    <country CountryCode="MX" CountryName="Mexico"/>
    <country CountryCode="US" CountryName="United States of America"/>
</countries>

找到Script.PostDeployment.sql,并添加以下代码:

DECLARE @h_Country int

DECLARE @xmlCountry xml = N'
:r ..\..\ReferenceData\Country.xml
'

EXEC sp_xml_preparedocument @h_Country OUTPUT, @xmlCountry

MERGE Country AS target USING (
    SELECT c.CountryCode, c.CountryName
    FROM OPENXML(@h_Country, '/countries/country', 1)
    WITH (CountryCode varchar(2), CountryName varchar(254)) as c) AS source (CountryCode, CountryName)
ON (source.CountryCode = target.CountryCode)
WHEN MATCHED THEN
    UPDATE SET CountryName = source.CountryName
WHEN NOT MATCHED BY TARGET THEN
    INSERT (CountryId, CountryCode, CountryName) values (newid(), source.CountryCode, source.CountryName)
;

我只在VS2008中try 过这个解决方案,但是它应该与您的开发环境无关.

Database相关问答推荐

在Prisma中建立关系

聚合以过滤 MongoDB 中的引用

MySQL主键:UUID / GUID vs BIGINT(时间戳+随机)

您如何使两个相关但独立的系统保持同步?

如何在 sql server 2005 中获取到数据库的详细连接列表?

管理数据库中的产品计数

SQL Server 中的Is Identity列属性是什么意思?

Spring Framework 中的默认隔离级别

try 重新打开一个已经关闭的对象:SQLiteDatabase

将整数作为字符串存储在数据库中的缺点

什么是表前缀?

用于获取存储在单个表中的 n 级父子关系的 Postgresql 查询

自动增量唯一标识符

在 SQL Server 2005 中将数据库从一个驱动器移动到另一个驱动器的正确方法是什么?

此平台不支持 LocalDB

如何将 DECIMAL 插入 MySQL 数据库

如何将sqlite表从磁盘数据库复制到python中的内存数据库?

Select 多模型 DBMS 时要考虑哪些因素? (OrientDB 与 ArangoDB)

如何通过数据库链接执行 Oracle 存储过程

如何将空值传递给外键字段?