【问题标题】:Update multiple records using stored procedure使用存储过程更新多条记录
【发布时间】:2016-08-19 14:30:11
【问题描述】:

作为一个新手,我有一个问题可以帮助我解决我正在处理的问题。

有了下面创建的表,有没有办法修改存储过程来更新表中的多行

CREATE TABLE AccountTable
(
  RowID int IDENTITY(1, 1),
  AccountID varchar(2),
  AccountName varchar(50),
  SeqNum int,
  SeqDate datetime
)

CREATE PROCEDURE [ACCOUNTTABLE_UPDATE]
(
  @SeqNum int,
  @SeqDate datetime,
  @Account_ID varchar(2)
)

AS 
SET NOCOUNT ON
BEGIN
UPDATE AccountTable
SET SeqNum = @SeqNum, SeqDate = @SeqDate
WHERE AccountID = @AccountID
END

EXEC ACCOUNTTABLE_UPDATE  SeqNumValue, SeqDateValue, AccountIDValue

手动运行存储过程当然会编辑一行,添加更多的值会导致参数过多的错误。我只是想看看这个存储过程实际上是否可以更新表中的多行,或者是否应该将其修改为实际上处理提供超过 3 个参数。

【问题讨论】:

标签: sql sql-server stored-procedures


【解决方案1】:

您可以使用表值参数(here 是一些信息)

首先创建表类型和SP:

USE MyDB;  
GO  

-- Create a table type.  
CREATE TYPE SomeTableType AS TABLE ( 
    SeqNum int,
    SeqDate datetime,
    Account_ID varchar(2)
);  
GO  

-- Create a procedure to receive data for the table-valued parameter. 
CREATE PROCEDURE [ACCOUNTTABLE_UPDATE]  
    @T SomeTableType READONLY  
AS   
SET NOCOUNT ON  

UPDATE AT
SET SeqNum = t.SeqNum, SeqDate = t.SeqDate
FROM AccountTable AT
INNER JOIN @T t
    ON t.AccountID = AT.AccountID
GO  

然后使用您之前创建的表类型声明表,添加数据并运行您的 SP:

-- Declare a variable that references the type. 
DECLARE @Temp AS SomeTableType;  

-- Add data to the table variable  
INSERT INTO @Temp VALUES
... 

-- Pass the table variable data to a stored procedure.
EXEC [ACCOUNTTABLE_UPDATE]  @Temp;  
GO  

另一种方法是将参数作为 XML 传递:

USE MyDB;  
GO  

CREATE PROCEDURE [ACCOUNTTABLE_UPDATE]  
    @x xml  
AS   
SET NOCOUNT ON  

UPDATE AT
SET SeqNum = t.v.value('@SeqNum','int'), 
    SeqDate = t.v.value('@SeqDate','datetime')
FROM AccountTable AT
INNER JOIN @x.nodes('/row') as t(v)
    ON t.AccountID = t.v.value('@AccountID','varchar(2)')

然后执行:

DECLARE @x xml = N'<row SeqNum="1" SeqDate="2016-08-01 12:43:08.000" AccountID="AA"/>'

EXEC [ACCOUNTTABLE_UPDATE]  @x; 

【讨论】:

  • 谢谢,简单易懂。
  • 我的荣幸!我已经用 xml 添加了一个解决方案,它也可能有用。
  • 只是一个更新,最糟糕的是,我使用的是 SQL Server 2000(我知道)我刚刚意识到它不适用于该版本。虽然,仍然感谢您的帮助。
  • 然后您可以使用一些永久表来存储您需要更新的值,并在SP中:删除参数(@T SomeTableType READONLY ),将INNER JOIN @T t更改为INNER JOIN YourNewTable t并在每次需要时运行它更新目标表中的值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-06
  • 2019-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多