2016-09-29 116 views
1

我有一個SQLServer數據庫,我想刪除所有表,除了一些表 我用用這個腳本從SQL Server數據庫中的所有表數據刪除,除了一些表

EXEC sp_MSforeachtable 'IF OBJECT_ID(''?'') NOT IN (
    ISNULL(OBJECT_ID(''[dbo].[T1]''),0) 
    ,ISNULL(OBJECT_ID(''[dbo].[T2]''),0) 
    ,ISNULL(OBJECT_ID(''[dbo].[T3]''),0) 
    ,ISNULL(OBJECT_ID(''[dbo].[T4]''),0) 
    ,ISNULL(OBJECT_ID(''[dbo].[T5]''),0) 
    ,ISNULL(OBJECT_ID(''[dbo].[T6]''),0) 
    ,ISNULL(OBJECT_ID(''[dbo].[T7]''),0) 
    ,ISNULL(OBJECT_ID(''[dbo].[T8]''),0) 
    ,ISNULL(OBJECT_ID(''[dbo].[T9]''),0) 
    ,ISNULL(OBJECT_ID(''[dbo].[T10]''),0) 
    ,ISNULL(OBJECT_ID(''[dbo].[T11]''),0) 
    ,ISNULL(OBJECT_ID(''[dbo].[T12]''),0) 
    ,ISNULL(OBJECT_ID(''[dbo].[T13]''),0) 
    ,ISNULL(OBJECT_ID(''[dbo].[T14]''),0) 
    ,ISNULL(OBJECT_ID(''[dbo].[T15]''),0) 
    ,ISNULL(OBJECT_ID(''[dbo].[T16]''),0) 
    ,ISNULL(OBJECT_ID(''[dbo].[T17]''),0) 
    ,ISNULL(OBJECT_ID(''[dbo].[T18]''),0) 
    ,ISNULL(OBJECT_ID(''[dbo].[T19]''),0) 
    ,ISNULL(OBJECT_ID(''[dbo].[T20]''),0) 
    ,ISNULL(OBJECT_ID(''[dbo].[T21]''),0) 
    ,ISNULL(OBJECT_ID(''[dbo].[T22]''),0) 
    ,ISNULL(OBJECT_ID(''[dbo].[T23]''),0) 
    ,ISNULL(OBJECT_ID(''[dbo].[T24]''),0) 
    ,ISNULL(OBJECT_ID(''[dbo].[T25]''),0) 
    ,ISNULL(OBJECT_ID(''[dbo].[T26]''),0) 
    ,ISNULL(OBJECT_ID(''[dbo].[T27]''),0) 
    ,ISNULL(OBJECT_ID(''[dbo].[T28]''),0) 
    ,ISNULL(OBJECT_ID(''[dbo].[T29]''),0) 
    ,ISNULL(OBJECT_ID(''[dbo].[T30]''),0) 
    ,ISNULL(OBJECT_ID(''[dbo].[T31]''),0) 
    ,ISNULL(OBJECT_ID(''[dbo].[T32]''),0) 
    ,ISNULL(OBJECT_ID(''[dbo].[T33]''),0) 
    ,ISNULL(OBJECT_ID(''[dbo].[T34]''),0) 
    ,ISNULL(OBJECT_ID(''[dbo].[T35]''),0) 
    ) 
    DELETE FROM ?' 

的SQLSERVER返回該錯誤消息"Msg 102, Level 15, State 1, Line 22 Incorrect syntax near 'ISN'."

我想問題可能是關於其除外

+0

您是否嘗試打印出SQL語句以檢查語法是否正確?您可能缺少報價或其他內容? – mfredy

+0

我打印了SQL語句,沒有任何缺失的報價 – Abdullah

回答

0

嘗試做另一種方式的表數:

DECLARE @command nvarchar(max); 

--Remove spaces in front of ,ISNULL 
SELECT @command = N'IF OBJECT_ID(''?'') NOT IN (
ISNULL(OBJECT_ID(''[dbo].[T1]''),0) 
,ISNULL(OBJECT_ID(''[dbo].[T2]''),0) 
,ISNULL(OBJECT_ID(''[dbo].[T3]''),0) 
,ISNULL(OBJECT_ID(''[dbo].[T4]''),0) 
,ISNULL(OBJECT_ID(''[dbo].[T5]''),0) 
... 
,ISNULL(OBJECT_ID(''[dbo].[TN]''),0) 
) 
DELETE FROM ?'; 

EXEC sp_MSforeachtable @command; 

注意:此SP只能在第一個命令(source)中與nvarchar(2000)一起使用。

這是第一個由此存儲過程執行的命令,其數據類型爲nvarchar(2000)。

+0

這很有幫助 – Abdullah

+0

我的榮幸! :) – gofr1

0
EXEC sp_MSforeachtable N'IF OBJECT_ID(''?'') NOT IN (ISNULL(OBJECT_ID(''[dbo].[T1]''),0),ISNULL(OBJECT_ID(''[dbo].[T2]''),0),ISNULL(OBJECT_ID(''[dbo].[T3]''),0),ISNULL(OBJECT_ID(''[dbo].[T4]''),0),ISNULL(OBJECT_ID(''[dbo].[T5]''),0),ISNULL(OBJECT_ID(''[dbo].[T6]''),0),ISNULL(OBJECT_ID(''[dbo].[T7]''),0),ISNULL(OBJECT_ID(''[dbo].[T8]''),0) 
               ,ISNULL(OBJECT_ID(''[dbo].[T9]''),0),ISNULL(OBJECT_ID(''[dbo].[T10]''),0),ISNULL(OBJECT_ID(''[dbo].[T11]''),0),ISNULL(OBJECT_ID(''[dbo].[T12]''),0) 
               ,ISNULL(OBJECT_ID(''[dbo].[T13]''),0) ,ISNULL(OBJECT_ID(''[dbo].[T14]''),0),ISNULL(OBJECT_ID(''[dbo].[T15]''),0),ISNULL(OBJECT_ID(''[dbo].[T16]''),0) 
               ,ISNULL(OBJECT_ID(''[dbo].[T17]''),0),ISNULL(OBJECT_ID(''[dbo].[T18]''),0),ISNULL(OBJECT_ID(''[dbo].[T19]''),0),ISNULL(OBJECT_ID(''[dbo].[T20]''),0),ISNULL(OBJECT_ID(''[dbo].[T21]''),0) 
               ,ISNULL(OBJECT_ID(''[dbo].[T22]''),0),ISNULL(OBJECT_ID(''[dbo].[T23]''),0),ISNULL(OBJECT_ID(''[dbo].[T24]''),0),ISNULL(OBJECT_ID(''[dbo].[T25]''),0) 
               ,ISNULL(OBJECT_ID(''[dbo].[T26]''),0),ISNULL(OBJECT_ID(''[dbo].[T27]''),0) 
               ,ISNULL(OBJECT_ID(''[dbo].[T28]''),0) 
               ,ISNULL(OBJECT_ID(''[dbo].[T29]''),0) 
               ,ISNULL(OBJECT_ID(''[dbo].[T30]''),0) 
               ,ISNULL(OBJECT_ID(''[dbo].[T31]''),0) 
               ,ISNULL(OBJECT_ID(''[dbo].[T32]''),0) 
               ,ISNULL(OBJECT_ID(''[dbo].[T33]''),0) 
               ,ISNULL(OBJECT_ID(''[dbo].[T34]''),0) 
               ,ISNULL(OBJECT_ID(''[dbo].[T35]''),0) 
               ) 
        DELETE FROM ?' 

的問題是,sp_msforeachtable有到您的查詢傳遞長度爲2000的第一個參數。由於您的查詢的長度超過該長度,因此它的全文不會傳遞給proc。這就是錯誤的原因。通過刪除一些換行符來縮短查詢的長度。嘗試我的查詢它的工作

+0

這是有幫助的 – Abdullah

相關問題