1

SQLServer2008を使用しています。

多くのテーブルがあり、各テーブルにはIDフィールドとTheOrderフィールドが含まれています。

TheOrderフィールドの2つのレコードの値を交換できるストアドプロシージャを作成したいと思います。

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フィールドの2つの値がNULLになりました。

何が問題ですか?

助けてくれてありがとう、そして長い質問をしてすみません。

4

1 に答える 1

1

この作業デモを見る

コードは以下のとおりです

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
于 2012-10-06T03:58:35.147 に答える