Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.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 server 如何使用动态SQL交换同一列中的两个值?_Sql Server_Sql Server 2008_Stored Procedures_Swap_Dynamic Sql - Fatal编程技术网

Sql server 如何使用动态SQL交换同一列中的两个值?

Sql server 如何使用动态SQL交换同一列中的两个值?,sql-server,sql-server-2008,stored-procedures,swap,dynamic-sql,Sql Server,Sql Server 2008,Stored Procedures,Swap,Dynamic Sql,我正在使用SQLServer2008 我有很多表,每个表都包含ID字段和TheOrder字段 我想创建一个存储过程,它可以交换排序字段中两条记录的值 我通过ASP.NET代码获取这些记录的ID,并将它们传递给存储过程 但是因为我想在许多表上执行这个存储过程,所以我必须使用动态SQL并从ASP.NET代码中传递表名 我的存储过程代码是: ALTER PROCEDURE [dbo].[SwapOrders] @TblName nvarchar(20) , @ID1 int ,

我正在使用SQLServer2008

我有很多表,每个表都包含ID字段和TheOrder字段

我想创建一个存储过程,它可以交换排序字段中两条记录的值

我通过ASP.NET代码获取这些记录的ID,并将它们传递给存储过程

但是因为我想在许多表上执行这个存储过程,所以我必须使用动态SQL并从ASP.NET代码中传递表名

我的存储过程代码是:

ALTER PROCEDURE [dbo].[SwapOrders]
    @TblName nvarchar(20)
    , @ID1 int
    , @ID2 int
AS
BEGIN
    DECLARE @ID1Str nvarchar(5)
    SET @ID1Str = CAST(@ID1 AS nvarchar)
    DECLARE @ID2Str nvarchar(5)
    SET @ID2Str = CAST(@ID2 AS nvarchar)
    DECLARE @Order1 nvarchar(5)
    DECLARE @Order2 nvarchar(5)
    DECLARE @Cmd nvarchar(100)
    /* Get orders */
    SET @Cmd = 'SELECT @Order1 = [TheOrder] FROM ' + @TblName + ' WHERE ID = ' + @ID1Str
    EXECUTE sp_executesql @Cmd, "@Order1 nvarchar(5) OUTPUT", @Order1 = [TheOrder]
    SET @Cmd = 'SELECT @Order2 = [TheOrder] FROM ' + @TblName + ' WHERE ID = ' + @ID2Str
    EXECUTE sp_executesql @Cmd, "@Order2 nvarchar(5) OUTPUT", @Order2 = [TheOrder]
    /* Update orders */
    SET @Cmd = 'UPDATE ' + @TblName + ' SET TheOrder = @Order2 WHERE ID = ' + @ID1Str
    EXECUTE sp_executesql @Cmd, "@Order2 nvarchar(5)", @Order2
    SET @Cmd = 'UPDATE ' + @TblName + ' SET TheOrder = @Order1 WHERE ID = ' + @ID2Str
    EXECUTE sp_executesql @Cmd, "@Order1 nvarchar(5)", @Order1
END
GO
当我测试这段代码时,TheOrder字段的两个值变为NULL

有什么问题

非常感谢您的帮助,很抱歉问了这么长的问题。

代码如下

CREATE PROCEDURE [dbo].[SwapOrders]
  @TblName nvarchar(20),
  @ID1 int,
  @ID2 int
AS
set nocount on
DECLARE @Cmd nvarchar(max) =
 'set nocount on;
  update t
  set TheOrder = u.TheOrder
  from ' + quotename(@tblname) + 't
  join ' + quotename(@tblname) + 'u on
  u.id=case when t.id=@id1 then @id2 else @id1 end
  where t.id in (@id1,@id2);';
exec sp_executesql @cmd, N'@id1 int,@id2 int', @id1, @id2;
GO

代码如下

CREATE PROCEDURE [dbo].[SwapOrders]
  @TblName nvarchar(20),
  @ID1 int,
  @ID2 int
AS
set nocount on
DECLARE @Cmd nvarchar(max) =
 'set nocount on;
  update t
  set TheOrder = u.TheOrder
  from ' + quotename(@tblname) + 't
  join ' + quotename(@tblname) + 'u on
  u.id=case when t.id=@id1 then @id2 else @id1 end
  where t.id in (@id1,@id2);';
exec sp_executesql @cmd, N'@id1 int,@id2 int', @id1, @id2;
GO

@Mahmoud这是跨越两条记录的…@RichardTheKiwi,我注意到
集合
更新
子句中的两个条件在同一个表中是相同的,所以我想他可以直接在一条
更新
子句中完成。@Mahmoud这是跨越两条记录的…@RichardTheKiwi,嗯,我注意到
集合
更新
子句中的两个条件在同一个表中是相同的,所以我想他可以直接在一个
更新
子句中完成。非常感谢@RichardTheKiwi,你救了我脱离疯狂,你是一个优秀的人。非常感谢@RichardTheKiwi,你救了我脱离疯狂,你是一个优秀的人。