【发布时间】:2016-03-25 17:46:24
【问题描述】:
我知道这里有很多相同的主题问题,我的问题是如果我想删除大约 1K 行而不是少数,给定RecordID 的List<int>,我可以避免使用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 +=")";
这将创建类似“('1','2','3'......)”的东西
然后创建SqlCommand来调用存储过程:
Delete * From @TblName WHERE @ColName IN @RecordsToDeleteCsvWhereIN
这是一种有效的方法吗?单个参数的长度有限制吗?我猜是N/VARCHAR(MAX) 的长度。
我想如果这不是一个有点骇人听闻的解决方案,它就不会受到长度的限制......
什么是最好的快速解决方案,或者我是否走在正确的轨道上?
【问题讨论】:
-
如何获取要删除的Id?它们是否与用户相关(用户选择要删除的这些项目)?如果没有,你能在程序里面直接找到它们吗?另外,你用什么来访问数据? ADO.NET?实体框架?
-
这可以做到在数据库上创建一个接受列表的函数这里是我目前使用 Select 语句的示例,但您将不得不乱搞,因为良好的学习体验使用类似的东西这个
Declare @SomeList varchar(8000) SET @SiteList = '1,2,3,4,5,6,7' SELECT * from tblSomeTable WHERE Some_KeyID IN (SELECT Item FROM fnParseInt(@SomeList,',')) -
另外你只需要说
Delete FROM TABLE not Delete * FROM我建议你开始阅读一些基本的Sql教程 -
@jpgrassi 我读了一个包含所有内容+列的表,根据文件存在决定删除哪些记录,如果为 false,则将 id 添加到列表中。取 list ,按 ids 删除。没有 EnTT FW
-
@MethodMan 我对 fn 不太熟悉,到目前为止,我更喜欢 SpMan,您能否在
list fn上提供更广泛的示例代码?
标签: c# performance sql-server-2012 sql-server-2014