在 Visual Studio 2010 数据库项目中生成种子数据

Posted

技术标签:

【中文标题】在 Visual Studio 2010 数据库项目中生成种子数据【英文标题】:Generate seed data in Visual Studio 2010 Database project 【发布时间】:2011-04-02 10:20:11 【问题描述】:

我在 Visual Studio 2010 中有一个数据库和一个数据库项目。我成功地推断出数据库项目中的架构,但我还需要以某种方式导入一些引用的表(国家、州、用户类型等)中的数据表而不是真正的数据表。

有办法吗?

到目前为止,我发现的唯一方法是在 SQL Server Management Studio 中生成数据脚本,并将此脚本放在数据库项目的部署后脚本文件中。

还有更简单的方法吗?

【问题讨论】:

【参考方案1】:

为 SQL Server 尝试Static Data Script Generator。它以正确的格式为您自动执行这些部署后脚本。这是一个免费的 Google Code 托管项目,我们发现它对于编写静态数据脚本很有用(也可以在现有数据之上进行更新)。

【讨论】:

Static Data Script Generator 在您第一次运行时会崩溃,因为您必须手动编辑配置。然后,它在我试图为其生成脚本的表上出现一些主键违规未处理的异常。 YMMV。 您确实需要对它有所了解。是的,它确实会在第一次爆炸,因为需要设置配置,因此它知道您想要什么数据库。至于第二个,这可能与我发现的问题相同。该脚本不检查外键,也无法知道如何对插入进行排序,因此它只是按照处理它们的顺序生成索引脚本。您需要手动组织它们的运行顺序以避免外键问题。主键违规可能意味着您正在尝试针对已经包含数据的数据库运行数据。无论如何,非常感谢 Junto!【参考方案2】:

这几乎是我以前的做法。

我会确保脚本中的每个语句看起来像:

IF (EXISTS(SELECT * FROM Country WHERE CountryId = 1))
    UPDATE MyTable SET Name = 'UK' WHERE CountryId = 1 AND Name != 'UK'
ELSE
    INSERT INTO MyTable (CountryId, Name) VALUES (1, 'UK')

这意味着每次部署数据库时,您的核心参考数据都会被插入或更新,以最合适的为准,您可以修改这些脚本来为较新版本的数据库创建新的参考数据。

您可以使用 T4 模板来生成这些脚本 - 我过去做过类似的事情。

【讨论】:

是的,这和我所做的差不多。我希望“导入模式”中的 UI 提示也可以导入数据或……但我想它只是不可用…… 不,我不知道。 Datadude 似乎主要关注模式,而不是数据。 谢谢...看来这就是我维护参考数据的方式:) 在 Red Gate,我们计划支持数据库项目,这意味着 SQL 源代码管理的功能,例如对静态数据的支持,将在数据库项目后端的顶部可用。您可以通过以下方式投票支持此功能:redgate.uservoice.com/forums/39019-sql-source-control/… 使用 postdeployment.script 和它完美地执行与新表和种子数据到它下面是脚本,之后我想添加新列并将数据插入其中我如何做到这一点插入到seedingTable (Id, Cric_name, Captain, region,[T20-Rank]) select 1, N'Pakistan', N'Babar Azam', N'Asia',N'1' where not exists (select 1 from dbo.seedingTable where id =1) 插入到seedingTable (Id, Cric_name, Captain, region,[T20-Rank]) select 2, N'England', N'Nasir Hussain', N'Wales',N'3' where not exists (select 1 来自 dbo.seedingTable,其中 id=2)【参考方案3】:

您还可以使用Merge INTO 语句在部署后脚本中的表中更新/删除/插入种子数据。我已经尝试过,它对我来说是一个简单的例子:

*/ print 'Inserting seed data for seedingTable'

MERGE INTO seedingTable AS Target 
USING (VALUES   (1, N'Pakistan', N'Babar Azam', N'Asia',N'1'),
(2, N'England',  N'Nasir Hussain', N'Wales',N'2'), 
(3, N'Newzeland', N'Stepn Flemming', N'Australia',N'4'), 
(4, N'India', N'Virat Koli', N'Asia',N'3'),  
(5, N'Bangladash', N'Saeed', N'Asia',N'8'),   
(6, N'Srilanka', N'Sangakara', N'Asia',N'7') ) 
AS Source (Id, Cric_name,captain,region,[T20-Rank]) ON Target.Id = Source.Id

-- update matched rows 
   WHEN MATCHED THEN 
   UPDATE SET Cric_name = Source.Cric_name, Captain = Source.Captain, Region=source.Region, [T20-Rank]=source.[T20-Rank]

-- insert new rows 
   WHEN NOT MATCHED BY TARGET THEN 
   INSERT (Id, Cric_name,captain,region,[T20-Rank]) 
   VALUES (Id, Cric_name,captain,region,[T20-Rank])
-- delete rows that are in the target but not the source
   WHEN NOT MATCHED BY SOURCE THEN
  DELETE;

【讨论】:

【参考方案4】:

通过使用 postdeployment.script 并在下面使用新表和种子数据完美执行是脚本,之后我想添加新列并将数据插入其中我该怎么做

 insert into seedingTable (Id, Cric_name, captain, region,[T20-Rank])
 select 1, N'Pakistan', N'Babar Azam', N'Asia',N'1' 
 where not exists
 (select 1 from dbo.seedingTable where id=1)     
 go
 insert into seedingTable (Id, Cric_name, captain, region,[T20-Rank]) select 2,
 N'England', N'Nasir Hussain', N'Wales',N'3' 
 where not exists
 (select 1 from dbo.seedingTable where id=2)

让我知道,每次使用 azure 管道部署数据库时,上面的脚本都会运行。如何更新数据。

【讨论】:

以上是关于在 Visual Studio 2010 数据库项目中生成种子数据的主要内容,如果未能解决你的问题,请参考以下文章

Visual Studio 2010 不会自动链接来自依赖项的项目中的静态库,因为它应该是

Visual Studio 2010/2012 Pro Power Tools

visual studio 2010怎么运行程序?

我的visual studio2010是盗版的,下列四项无法更新。请问是啥啊?怎么才能更新成功?谢谢啦!

如何在 Visual Studio 2010 中设置 Qt 路径?

关于在Visual Studio2010中如何卸载Visual Asixist这个插件?为啥将它卸载后Visual Studio启动后仍然有