Sql 使用不同值更新字段的存储过程
我正在使用SQL Server 我需要创建一个存储过程,用不同的值为每个ID值更新数据字段(下表)。(数据字段中的值取决于用户输入) 例如: 如果ID=1,则数据应为“Test1” ID和数据对应该以某种方式作为存储过程的输入参数Sql 使用不同值更新字段的存储过程,sql,sql-server,stored-procedures,sql-update,Sql,Sql Server,Stored Procedures,Sql Update,我正在使用SQL Server 我需要创建一个存储过程,用不同的值为每个ID值更新数据字段(下表)。(数据字段中的值取决于用户输入) 例如: 如果ID=1,则数据应为“Test1” ID和数据对应该以某种方式作为存储过程的输入参数 这是可能的,还是我必须为每个ID/数据对调用简单的更新过程?您可以使用另一个表和您的值作为更新的源 update t set Data = src.Data from tableDestination t inner join sourceTable src on
这是可能的,还是我必须为每个ID/数据对调用简单的更新过程?您可以使用另一个表和您的值作为更新的源
update t
set
Data = src.Data
from tableDestination t
inner join sourceTable src on
t.ID = src.ID
您可以使用另一个带有值的表作为更新的源
update t
set
Data = src.Data
from tableDestination t
inner join sourceTable src on
t.ID = src.ID
您可以使用另一个带有值的表作为更新的源
update t
set
Data = src.Data
from tableDestination t
inner join sourceTable src on
t.ID = src.ID
您可以使用另一个带有值的表作为更新的源
update t
set
Data = src.Data
from tableDestination t
inner join sourceTable src on
t.ID = src.ID
您需要为此用户定义的表类型: 试试这个:
-- 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
您需要为此用户定义的表类型: 试试这个:
-- 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
您需要为此用户定义的表类型: 试试这个:
-- 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
您需要为此用户定义的表类型: 试试这个:
-- 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
您需要使用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>'
[UpdateMultipleRecords]“1Test12Test2”
您需要使用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>'
[UpdateMultipleRecords]“1Test12Test2”
您需要使用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>'
[UpdateMultipleRecords]“1Test12Test2”
您需要使用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>'
[UpdateMultipleRecords]“1Test12Test2”
数据是动态的(取决于用户输入)。因此,如果我使用另一个表,我需要将所有数据插入该临时表,然后更新原始表。这是您的想法吗?@Programmer您希望存储过程根据id更新数据列值吗?是的,但我需要在同一存储过程中进行多次更新。此外,更新的数量是动态的。例如,存储过程中的输入参数可以是:1,Test;2,测试2。也可以是:3、测试;5,测试1;数据是动态的(取决于用户输入)。因此,如果我使用另一个表,我需要将所有数据插入该临时表,然后更新原始表。这是您的想法吗?@Programmer您希望存储过程根据id更新数据列值吗?是的,但我需要在同一存储过程中进行多次更新。此外,更新的数量是动态的。例如,存储过程中的输入参数可以是:1,Test;2,测试2。也可以是:3、测试;5,测试1;数据是动态的(取决于用户输入)。因此,如果我使用另一个表,我需要将所有数据插入该临时表,然后更新原始表。这是您的想法吗?@Programmer您希望存储过程根据id更新数据列值吗?是的,但我需要在同一存储过程中进行多次更新。此外,更新的数量是动态的。例如,存储过程中的输入参数可以是:1,Test;2,测试2。也可以是:3、测试;5,测试1;数据是动态的(取决于用户输入)。因此,如果我使用另一个表,我需要将所有数据插入该临时表,然后更新原始表。这是您的想法吗?@Programmer您希望存储过程根据id更新数据列值吗?是的,但我需要在同一存储过程中进行多次更新。此外,更新的数量是动态的。例如,存储过程中的输入参数可以是:1,Test;2,测试2。也可以是:3、测试;5,测试1;7,测试6。