【问题标题】:Multiple rows Sql Server update using a Dedicated Table Value parameter - Stored Procedure使用专用表值参数更新多行 Sql Server - 存储过程
【发布时间】:2016-02-04 11:38:06
【问题描述】:

使用下面的存储过程,我可以选择表的可变部分,给定每条记录的行索引。我尝试创建另一个类似于MulTselect 的存储过程,只是这次表值参数将有另一列用于MulTUpdate 存储过程的新值。

[RowIndex] int, [NewVal] [varchar] (4000) NOT NULL

问题是,鉴于记录 - Rowindex 和“NewValue”,是否可以像下面的选择过程中那样对多条记录执行 UPDATE

--sproc signature

CREATE Proc [dbo].[MulTSELECTViaRowIndexSpTVP] 
@SelectedTableName varchar (50),
@SelectedAction varchar(10),
@TestMulTSELECTViaRowIndexTVPar dbo.TestMulTSELECTViaRowIndexTVType READONLY


SET @CmdStr = 'SELECT * FROM ' + @SelectedTableName + ' 
               WHERE RowIndex in (SELECT RowIndex from @TestMulTSELECTViaRowIndexTVPar);'

EXEC sp_executesql @CmdStr,N' @TestMulTSELECTViaRowIndexTVPar dbo.TestMulTSELECTViaRowIndexTVType READONLY',
         @TestMulTSELECTViaRowIndexTVPar= @TestMulTSELECTViaRowIndexTVPar

【问题讨论】:

  • 通过添加@SelectedColumnName参数
  • 类似SET @CmdStr = 'UPDATE ' + @SelectedTableName + ' SET ' + @SelectedColName + 'WHERE RowIndex in ...

标签: c# sql-server stored-procedures table-valued-parameters


【解决方案1】:

当我浏览我的旧存储过程时,我发现了一个以正确的方式盯着我思考的过程,所以这是我要编译的,尚未测试。

Declare @TotalRec int = (Select COUNT(RowIndex) from @TestMulTiActMulTColIndexTVPar);
Declare @Iter int =0, @Count int =0;
While @Iter < @TotalRec
     Begin
        Declare @curRowIndex int=
                (
                    select RowIndex from
                        (select row_number() over (order by RowIndex) as RowN,
                        * from  @TestMulTiActMulTColIndexTVPar) T where T.RowN =(@Iter+1)
               );
        Declare @CurVal varchar(4000) = (Select [StrVal] from @TestMulTiActMulTColIndexTVPar WHERE RowIndex=@curRowIndex);
        SET @CmdStr = 'UPDATE ' + @SelectedSDTOName + ' SET ' + @SelectedColName + ' = ' + QUOTENAME(@CurVal, '''') + ' WHERE RowIndex = ' + CAST(@curRowIndex as nvarchar);

        EXEC sp_executesql @CmdStr,N' @TestMulTiActMulTColIndexTVPar dbo.TestMulTiActMulTColIndexTVType READONLY',
                                 @TestMulTiActMulTColIndexTVPar= @TestMulTiActMulTColIndexTVPar;
        Set @Iter = @Iter + 1;
    End

SELECT 'EffRows' = @Iter; 

这是我能用我的技能创作的最好的作品, 当它迭代时,它分别执行每个更新命令(在while循环内),而不是选择过程

SELECT * FROM ' + @SelectedTableName + ' 
           WHERE RowIndex in (SELECT RowIndex from @TestMulTSELECTViaRowIndexTVPar);'

所以我不知道它是否会像我在这里编码的那样表现最好...... 任何评论都将非常受欢迎。

感谢您的宝贵时间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-27
    • 1970-01-01
    相关资源
    最近更新 更多