删除Sqlserver数据库中除某些表外的所有表中的数据

时间:2016-09-29 09:52:49

标签: sql sql-server sql-server-2008

我有一个SQLSERVER数据库,我想删除除一些表之外的所有表 我使用这个脚本

  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'."

我认为问题可能与表格的数量无关

2 个答案:

答案 0 :(得分: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)。

答案 1 :(得分: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。这就是错误的原因。通过删除一些换行符来缩短查询的长度。试试我的查询工作