Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 使用不同值更新字段的存储过程_Sql_Sql Server_Stored Procedures_Sql Update - Fatal编程技术网

Sql 使用不同值更新字段的存储过程

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

我正在使用SQL Server

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

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

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


这是可能的,还是我必须为每个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。