【问题标题】:SQL Server Stored Procedure Multiple Insert in a single table from ArraySQL Server存储过程从数组中的单个表中多次插入
【发布时间】:2013-11-19 20:17:40
【问题描述】:

我正在使用存储过程将记录插入表中。并且在一个循环中至少执行 12 次以插入多条记录,这是非常低效的。

这里是创建过程

 Create PROC [dbo].[SP_INSERT_G_SAMPLING]
 @GameID INT,
 @ScoreID INT
 as 
 begin
 INSERT INTO GAMESCORE (GAMEID, SCOREID) VALUES
 (@GameID, @ScoreID)
 end

我传递值 ex(1,3) 并循环使用来自网站的更多值。

我想同时传递所有值,例如 (1,3),(4,5),(8,9)

然后更改上述过程以接收和插入多行。

ALTER PROC [dbo].[SP_INSERT_G_SAMPLING]
@totalinsert nvarchar(Max) 

INSERT INTO GAMESCORE (GAMEID, SCOREID) VALUES
(@totalinsert)

@totalinsert 类似于从网页推送的 (1,3),(4,5),(8,9)。

非常感谢任何帮助

【问题讨论】:

  • 您使用的是哪个版本的 SQL Server?表值参数 (TVP) 是执行此操作的首选方式。
  • 您是否考虑过在 SQL Server 中使用 XML 数据类型?
  • 旁注:您应该为您的存储过程使用sp_ 前缀。微软有reserved that prefix for its own use (see Naming Stored Procedures),你确实会在未来某个时候冒着名称冲突的风险。 It's also bad for your stored procedure performance。最好只是简单地避免 sp_ 并使用其他东西作为前缀 - 或者根本不使用前缀!
  • 服务器上的 SQL Server 2005。在本地我有 12 岁。我想选择适合 05 岁及以上的东西。

标签: sql sql-server stored-procedures


【解决方案1】:

您要做的是编写一个表值函数,该函数接受多值字符串并将其分解为表对象。如果您可以更改源以使用记录分隔符而不是逗号集,则处理起来会稍微容易一些。一个示例如下所示。

以下内容纯属虚构,未经任何验证,只是为了让您大致了解该去哪里。

例如:@TotalInsert = 1,2|4,5|8,9

DECLARE @Results TABLE
  (
     value1 INT,
     value2 INT
  )
DECLARE @setlist VARCHAR(max);

WHILE Len(@TotalInsert) > 0
  BEGIN
      SET @setlist = LEFT(@totalinsert, Charindex('|', @totalinsert))

      INSERT INTO @results
      SELECT LEFT(@setlist, Charindex(',', @setlist) - 1),
             RIGHT(@setlist, Charindex(',', Reverse(@setlist)) + 1)

      SET @totalinsert = RIGHT(@totalinsert, Len(@totalinsert) - Len(@setlist))
  END  

【讨论】:

  • 因为这是一个表值函数,所以当您编写该类型的函数时,您将值存储到表变量中,然后再从函数中返回它们。示例可以在 msdn 中找到:technet.microsoft.com/en-us/library/…
  • David 如何获得执行存储过程和插入的函数?我已经玩了一段时间了,我得到的只是错误。已经阅读了大量关于此的文章并尝试了很多,我现在比以往任何时候都更加困惑。
【解决方案2】:

我假设您在使用 .NET 作为您的网站,因为您也在使用 SQL Server。

查看table valued parameters,该页面还包含一个很好的示例,说明如何在 .NET 中使用表值参数。

查看here 以获得在 T-SQL 中使用表值参数创建存储过程的更好示例。

【讨论】:

    【解决方案3】:

    这里是完整的讨论:

    http://www.sommarskog.se/arrays-in-sql-2005.html#XMLlist%20of%20values

    就我个人而言,我将 xml 发送到存储过程,我将其“分解”到 @variable 或 #temp 表中,然后从那里执行我的 INSERT/UPDATE/MERGE/DELETE。

    这里是关于 xml-shredding 的更全面的讨论。

    http://pratchev.blogspot.com/2007/06/shredding-xml-in-sql-server-2005.html

    我个人的技巧是创建一个强数据集,用行填充强数据集,然后使用 ds.GetXml() 将 xml 发送到 TSQL。使用强大的数据集,我在填充值时会得到强类型。但归根结底,dataset 只是一些超级花哨的 xml。

    【讨论】:

      猜你喜欢
      • 2017-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-10
      相关资源
      最近更新 更多