小编Rob*_*015的帖子

多行Sql Server使用专用表值参数更新 - 存储过程

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

[RowIndex] int, [NewVal] [varchar] (4000) NOT NULL
Run Code Online (Sandbox Code Playgroud)

问题是,给定记录 - 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
Run Code Online (Sandbox Code Playgroud)

c# sql-server stored-procedures table-valued-parameters

5
推荐指数
1
解决办法
510
查看次数

C#和SQL Server - 使用存储过程"一次性"删除多行的最佳方法

我知道那里所以这里的许多相同经历的问题,我的问题是,如果我想删除说1K左右行相当少,给出List<int>RecordID,我会避免使用DataTable,并发送翻译成语句列表:

string ParmRecordsToDelete_CsvWhereIN = "("
for(int CurIdx=0; CurIdx < RecIdsToDelete.Count; CurIdx++)
{
  ParmRecordsToDelete_CsvWhereIN += RecIdsToDelete[CurIdx] + ", ";
  //this method to create passed parameter 
  //logic to remove on last Coma on last Index..

  //or use stringJoin and somehow remove the last coma 
}
ParRecordsToDelete_CsvWhereIN +=")";
Run Code Online (Sandbox Code Playgroud)

这将创建像"('1','2','3'......)"

然后创建一个SqlCommand调用存储过程:

Delete * From @TblName WHERE @ColName IN @RecordsToDeleteCsvWhereIN
Run Code Online (Sandbox Code Playgroud)

这是一种有效的方法吗?单个参数的长度是否有限制?我猜这是N/VARCHAR(MAX)长度.

我想如果它不是一个有点hackish解决方案它不会受到长度的限制......

什么是最好的快速解决方案,还是我在正确的轨道上?

c# performance sql-server-2012 sql-server-2014

3
推荐指数
1
解决办法
6370
查看次数