我遇到了一个应用程序的问题,该应用程序正在引导我执行以下操作。在C#代码中优化SQL函数
protected override int GetCount(List<int> itemlist)
{
sql.Execute(@"TRUNCATE Table table0");
int count = 0;
foreach (int itemgroup in itemlist)
{
count += sql.Execute(@" INSERT INTO table0 (ID, Guid)
SELECT table1.ID , table1.Guid
FROM dbo.tablefunction(@p0) table1 LEFT JOIN
dbo.table0 ON table1.ID = table0.ID
WHERE table0.ID IS NULL", itemgroup);
}
return count;
}
我是插入循环这是不完全出乎意料期间运行到一个关键的制约问题。
但我也注意到它可能会做多个不同大小的插入,所以我正在寻找动态组装联合查询的想法/建议,然后一次插入所有结果。例如,生成的查询可能是
WITH b AS
(
SELECT table1.ID , table1.Guid
FROM dbo.tablefunction(item0) table1 LEFT JOIN
dbo.table0 ON table1.ID = table0.ID
WHERE table0.ID IS NULL
UNION
SELECT table1.ID , table1.Guid
FROM dbo.tablefunction(item1) table1 LEFT JOIN
dbo.table0 ON table1.ID = table0.ID
WHERE table0.ID IS NULL
)
INSERT INTO table0 (ID, Guid)
SELECT * FROM b
我只是不确定如何最好地去做。
它不是真的与您的动态大小的插入相关,但可以从多个位置同时调用此代码吗?如果是这样,如果在插入值之后表由另一个实例获取TRUNCATEd会发生什么情况,那么您不再拥有应该具有的值,而只需要一个空表而已? – seventyeightist
有一个锁可以防止它同时运行。但是它所插入的表格也被序列中的下一组方法所使用,然后冲洗并重复,因此截断。有可能有更好的方法来完成整个事情,但我希望保持这种变化独立于这种方法,以避免更大的回归 –
那么,编写union声明时会出现什么问题?看起来像一堆字符串连接。 – Evk