visual-studio-2010 - 使用 Visual Studio 2010 数据库项目填充静态数据的最佳实践?

标签 visual-studio-2010 populate database-project

如何使用 Visual Studio 数据库项目用静态的、源代码控制的数据填充数据库?我已经尝试了以下所有三种策略,发现每一种都比上一种更好。我正在使用但对策略 3 并不完全满意。您有其他选择吗?

  • 将插入脚本放在“数据生成计划”文件夹中。引用“Script.PostDeployment.sql”文件中的脚本以将它们包含在部署过程中。

    -- 优点:直截了当
    -- 缺点:slooooooow
    -- 缺点:后续部署必须先删除静态数据或检查数据不存在 => 低效
  • 第一次使用最方便的方法将数据插入数据库(例如,可以是 SSMS 编辑表功能)。使用 bcp 命令行实用程序提取该数据以创建一堆数据文件并将它们添加到您的项目中。创建在“Scripts.PostDeployment.sql”文件中引用的脚本,为每个数据文件执行“批量插入”语句。

    -- 优点:比插入语句快得多
    -- 优点:可以利用 SSMS 编辑表功能
    -- 缺点:每个批量插入语句都需要数据文件的完全限定文件名,因此如果数据文件位于我的机器上的“C:\Projects\Dev\Source\foo.dat”,那么远程开发机器也必须将它们放在该位置或批量插入语句失败
    -- 缺点:在后续部署中执行批量插入语句之前必须删除现有的静态数据
  • 在部署期间创建临时表来保存静态数据,并使用 sql merge 语句将这些表与目标表同步。见 eitherthese博客文章。

    -- 优点:似乎 sql merge 对这个问题有完美的语义
    -- 缺点:此策略的逻辑在每个文件中重复
    -- 缺点:表定义在 sql 合并文件中作为临时表重复

  • 有没有更好的替代策略?我放弃了策略 1,因为它太慢了。由于完全限定的文件名问题,我不喜欢策略 2。我对策略 3 感到满意但并不激动。是否有最佳实践?

    最佳答案

    在您的 insert.sql 脚本中,您可以在 [__RefactorLog] 表(这是部署使用的系统表)中放置一个 GUID,并在插入您的数据之前检查此 GUID 是否存在,如下所示:

    :setvar SOMEID "784B2FC9-2B1E-5798-8478-24EE856E62AE"//在 VS2010 中使用 Tools\CreateGuid 创建 guid

    如果不存在 (SELECT [OperationKey] FROM [dbo].[__RefactorLog] where [OperationKey] = '$(SOMEID)')

    开始

    ...

    INSERT INTO [dbo].[__RefactorLog] ([OperationKey] ) values( '$(SOMEID )' )

    结尾

    然后,仅当数据不存在或需要时才插入数据(通过更改 Guid)。

    关于visual-studio-2010 - 使用 Visual Studio 2010 数据库项目填充静态数据的最佳实践?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4279902/

    相关文章:

    database - SQL SERVER 中的 String 到 Money 数据类型

    ios - 删除预填充的数据库

    java - 如何将修改后的预序树遍历数据填充到 Java 树对象中?

    sql-server - 我可以在 Visual Studio 数据库项目存储过程中使用 SQLCMD 命令吗?

    visual-studio - Visual Studio 2012 数据库项目发布列顺序

    javascript - 如何使用纯javascript制作简单的图片库

    c++ - Windows 已生成断点

    c++ - 在 Qt Creator 中编译 Visual Studio 2010 项目?

    c - 我的遗传算法 C 代码不起作用,它不进入 if 条件

    visual-studio-2008 - 数据库项目需要很长时间才能打开