我正在使用SQL Server。
我需要创建一个存储过程,它将为每个ID值更新不同值的Data字段(下表)。 (数据字段中的值取决于用户输入)。
ID | Data
---------
1 | NULL
2 | NULL
3 | NULL
例如: 如果ID = 1,则数据应为" Test1"
ID和数据对应该以某种方式成为存储过程的输入参数。
这可能,或者我必须为每个ID /数据对调用简单的更新程序吗?
答案 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