使用下面的存储过程,我可以在给定每条记录的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) 我知道那里所以这里的许多相同经历的问题,我的问题是,如果我想删除说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解决方案它不会受到长度的限制......
什么是最好的快速解决方案,还是我在正确的轨道上?