存储过程,用于更新具有不同值的字段

时间:2014-09-18 09:07:21

标签: sql sql-server stored-procedures sql-update

我正在使用SQL Server。

我需要创建一个存储过程,它将为每个ID值更新不同值的Data字段(下表)。 (数据字段中的值取决于用户输入)。

ID | Data
---------
1     | NULL

2     | NULL

3     | NULL

例如: 如果ID = 1,则数据应为" Test1"

ID和数据对应该以某种方式成为存储过程的输入参数。

这可能,或者我必须为每个ID /数据对调用简单的更新程序吗?

3 个答案:

答案 0 :(得分:2)

您需要使用XML来发送多行数据。对于您当前的问题,请准备(动态生成)xml,如下所示。

 '<NewDataSet><Table><Id>1</Id><Data>test1</Data></Table><Table><Id>2</Id><Data>test2</Data></Table></NewDataSet>'

然后准备如下的程序。

CREATE PROC [dbo].[UpdateMultipleRecords]    
 (                
 @XmlString VARCHAR(MAX)  
 )              
 AS                      
 BEGIN    
 SET NOCOUNT ON;     



 CREATE TABLE #DATA    
 (              
 Id int,    
 Data varchar(50) NULL 

 )    

 DECLARE @DocHandle int    
 EXEC sp_xml_preparedocument @DocHandle OUTPUT, @XmlString    

 INSERT INTO #DATA    
 SELECT Id,Data
 FROM OPENXML (@DocHandle, '/NewDataSet/Table',2)    
 WITH    
 (                    
 Id int,    
 Data varchar(50)  
 )    
  EXEC sp_xml_removedocument @DocHandle                

 UPDATE [dbo].[Table1]  SET DATA=D.Data
 FROM [dbo].[Table1] T  INNER JOIN #DATA D ON T.ID=D.Id

IF (SELECT OBJECT_ID('TEMPDB..#DATA')) IS NOT NULL DROP TABLE #DATA    

END

将程序称为

[UpdateMultipleRecords] '<NewDataSet><Table><Id>1</Id><Data>Test1</Data></Table><Table><Id>2</Id><Data>Test2</Data></Table></NewDataSet>'

答案 1 :(得分:1)

您需要用户定义的表类型:

试试这个:

-- test table
create table yourtable(id int not null, data [varchar](256) NULL)

GO

-- test type
CREATE TYPE [dbo].[usertype] AS TABLE(
    [id] [int] not null,
    [Data] [varchar](256) NULL
)
GO

-- test procedure
create procedure p_test
(
@tbl dbo.[usertype] READONLY
) as
BEGIN
  UPDATE yourtable
  SET data = t.data
  FROM yourtable
  JOIN
  @tbl t
  ON yourtable.id = t.id
END

go

-- test data

insert yourtable(id)
values(1),(2),(3)

go

剧本测试:

declare @t [dbo].[usertype]
insert @t values(1,'hello'),(2,'world')

exec p_test @t

select * from yourtable

结果:

id  data
1   hello
2   world
3   NULL

答案 2 :(得分:0)

您可以使用另一个表格,将您的值作为更新的来源

update t
set
 Data = src.Data
from tableDestination t
inner join sourceTable src on
    t.ID = src.ID