我正在嘗試在存盤程序中運行洗掉查詢,但我不斷收到以下錯誤:
將資料型別 varchar 轉換為 bigint 時出錯。
request_id columnworkflow_status 的型別是bigint。
以下是我在存盤程序中嘗試執行的操作:
DECLARE @wp_ids_to_delete varchar(8000)
SET @wp_ids_to_delete = 'SELECT id FROM [dbo].[wp_req] WHERE creation_date < DATEADD(YEAR, -1, GETDATE())';
DELETE FROM [dbo].[workflow_status]
WHERE request_id IN ( @wp_ids_to_delete );
SELECT查詢作業正常:
SET @SqlStatement_workflow_status = 'SELECT * FROM [dbo].[workflow_status] WHERE request_id IN (' @wp_ids_to_delete ')';
uj5u.com熱心網友回復:
您無需構建串列并將其傳遞給另一個陳述句(即使您正確構建了串列并且IN ('id1,id2')有效):
DELETE ws
FROM dbo.workflow_status AS ws
WHERE EXISTS
(
SELECT 1 FROM dbo.wp_req AS wr
WHERE wr.id = ws.request_id
AND wr.creation_date < DATEADD(YEAR, -1, GETDATE())
);
uj5u.com熱心網友回復:
SELECT您認為運行良好的示例實際上根本不是SELECT陳述。這是一個SET運行良好的陳述句,因為它只是將一個變數設定為一個字串值,而恰好是以SELECT陳述句的形式撰寫的。
同樣,您的 delete 陳述句由于相同的原因而失敗。那是因為您要求它洗掉request_id字串值中的行,該變數被設定為。下面是您的陳述句的整體效果,正如您所寫的那樣,當它被執行時。如您所見, 的值'SELECT id FROM [dbo].[wp_req] WHERE creation_date < DATEADD(YEAR, -1, GETDATE())'無法轉換為 INT。
DELETE FROM [dbo].[workflow_status]
WHERE request_id IN ( 'SELECT id FROM [dbo].[wp_req] WHERE creation_date < DATEADD(YEAR, -1, GETDATE())' );
試試這個為你洗掉陳述句。
DELETE FROM [dbo].[workflow_status]
WHERE request_id IN (
SELECT id
FROM [dbo].[wp_req]
WHERE creation_date < DATEADD(YEAR, -1, GETDATE())
)
此外,請考慮此陳述句將洗掉多少行,以及運行它時可能觸發的任何觸發器。它在運行時可能會導致大量阻塞并在事務日志中產生開銷。例如,如果您希望它洗掉幾十萬行或數百萬行,您可能需要考慮一次洗掉大約 10,000 行的批處理方法。
uj5u.com熱心網友回復:
你SELECT不會去“KABOOM”;這與您認為的作業方式不同。
如果你要這樣做:
SET @SqlStatement_workflow_status = 'Select * from [dbo].[workflow_status] where request_id IN (' @wp_ids_to_delete ')';
SELECT @SqlStatement;
你會看到它回傳:
Select * from [dbo].[workflow_status] where request_id IN (SELECT id FROM [dbo].[wp_req] WHERE creation_date < DATEADD(YEAR, -1, GETDATE()))
沒有它實際運行該查詢。
現在,將 in 表示的查詢直接作為子查詢的另外兩個答案@wp_ids_to_delete將起作用,但我相信就未來的可維護性而言,可以通過使用 a 來改進它們JOIN:
DELETE s
FROM [dbo].[workflow_status] s
INNER JOIN [dbo].[wp_req] r
ON r.id = s.request_id
AND r.creation_date < DATEADD(YEAR, -1, GETDATE());
請注意,正如 Aaron 在評論中指出的那樣,當前建議的所有 3 個答案都適用于相同的執行計劃。3 中沒有更快或更有效的選擇;這取決于首選的查詢方式。
如果您確實想將 ID 串列存盤為逗號分隔的字串以供以后使用,那么您可以執行以下操作:
SET @wp_ids_to_delete = SELECT STRING_AGG(id) FROM [dbo].[wp_req] WHERE creation_date < DATEADD(YEAR, -1, GETDATE());
你SELECT可能會變成:
SET @SqlStatement_workflow_status = 'Select * from [dbo].[workflow_status] where request_id IN (' @wp_ids_to_delete ');';
EXEC @SqlStatement_workflow_status;
你DELETE可能會變成:
SET @delete_Statement = 'DELETE FROM [dbo].[workflow_status]
WHERE request_id IN ( ' @wp_ids_to_delete ' );';
EXEC @delete_Statement;
但是,這可能比其他選項慢。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/441788.html
