1

我目前在这里挣扎。

环境: 我在改进使用 MSSQL Server 2008 R2我没有使用任何类型的 ORM。

设计/模型:(虚构)我有一个对话、一条消息和一个附件。对话有多条消息,每条消息可以有多个附件。很容易 1 .. N 连接在那里。

问题:我想在我的数据库中存储一个新的对话,包含新的对话消息和新的附件。我现在的情况是我通过保存对话自上而下。检索该 id,将该 id 设置为消息对象并存储消息(每次我进行单独的数据库调用时)。对于所有附件,同样的故事,我需要先存储消息,然后才能存储这些附件。

我研究过或想到的解决方案

  • 目前我通过存储过程单独执行这些步骤,自上而下的保存机制。

  • SqlBulkCopy:真的很快。我想到了,存储所有对话,取回 ID,存储所有消息,取回他们的 ID 等等......但是问题就在这里,我需要做一个查询,比如“给我所有 20 个最后创建的记录他们的 ID”。可行,但事实上这个应用程序是多线程的,可能在那一刻其他线程会插入新行或更糟的是,被删除。

  • 创建存储过程 一个疯狂的存储过程,我在其中发送一个数据集对象(这是更自由的头脑风暴)。

  • 手动生成一个巨大的 sql 命令,用于存储对话、获取生成的 id 并将其用于子对象。喜欢(伪SQL):

    插入对话

    currentConversationId = @Identity

    插入带有 conversationId = currentConversationId 的消息

目标 是否有人有更好的建议或替代方案。请避免建议我使用 ORM,因为我正在处理遗留项目。我想尽可能多地保存数据库调用。

4

2 回答 2

2

使用表值参数发送多行以在一次调用中插入。您可以使用该OUTPUT INSERTED.ID子句检索已创建的 ID。使用该MERGE语句时,您不仅可以检索 ID,还可以从 TVP 检索原始值。这对于将 ID 与 TVP 行匹配很有用。这可能看起来像这样:

OUTPUT @tvp.SomeID, INSERTED.ID
于 2013-07-14T16:41:30.333 回答
1
  1. 使用表锁执行 SqlBulkCopy,这样其他线程就不会弄乱您的数据
  2. 在代码中生成查询 => 我知道很多项目都这样做,这对于批量插入似乎是可以接受的......
  3. usr 的回答,使用 TVP 并将 id 与自定义生成的数字相关联
  4. 切换到您的 ID 的 GUID(DBA 会为此杀死您:-P)

祝你好运!

于 2013-07-15T10:22:56.207 回答