Sql-Server

無法對 while 循環中的語句執行選項提示

  • October 3, 2016

SQL Server 2014 兼容性級別 110 使用舊的基數估計器。我正在嘗試強制執行新的 CE 聲明。我收到錯誤“關鍵字‘選項’附近的語法不正確。” 我需要批量刪除。

while 
(   
   Select top (1) 1
   from [AdventureWorks].dbo.DatabaseLog
   option (querytraceon 2312)  --error
) > 0
begin
   delete top (10000 )
   from [AdventureWorks].dbo.DatabaseLog
end

– 它自己執行正常:

Select top (1) 1
from [AdventureWorks].[Person].[Person]
option (querytraceon 2312) 

option 子句只能用於獨立SELECT語句。

不是SELECT用作表達式的地方。

以下範例也不允許您指定查詢提示。

DECLARE @I INT = (SELECT 1 OPTION (RECOMPILE))

IF (1 = (SELECT 1 OPTION (RECOMPILE))
   PRINT '1';

所以你要麼需要

  • 重組您的程式碼,以便您嘗試應用查詢提示的語句不會直接嵌入內聯WHILE(需要重複該語句或將其包裝在非內聯函式中)
  • 在會話級別設置跟踪標誌
  • 使用計劃指南(可能 - 我沒有測試過)

對於您問題中的具體範例,您根本不需要SELECT

DECLARE @Dummy VARCHAR(100) ='setting initial rowcount'

WHILE @@rowcount > 0
 BEGIN
     DELETE TOP (10000 ) FROM [AdventureWorks].dbo.DatabaseLog;
 END 

或(因為這最終會刪除所有行)。

TRUNCATE TABLE [AdventureWorks].dbo.DatabaseLog;

引用自:https://dba.stackexchange.com/questions/151235