2016-09-29 113 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

相关问题