我遇到了一個應用程序的問題,該應用程序正在引導我執行以下操作。在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