从批处理文件中删除SQL Server数据库中的所有表?

时间:2011-04-13 20:08:11

标签: sql sql-server sql-server-2005

我有这个批处理文件,它将所有表的列表输出到文件中。我正在寻找将输入此列表的命令,并生成一个drop语句的完整列表以删除所有表?

:: droptables.bat
set SQLVER=100
if NOT EXIST "%PROGRAMFILES%\Microsoft SQL Server\100\Tools\BINN\osql.exe" (
  @echo MS SQL Server 2008 not found.
  set SQLVER=90
  if NOT EXIST "%PROGRAMFILES%\Microsoft SQL Server\90\Tools\BINN\osql.exe" (
    @echo MS SQL Server 2005 not found.
    set SQLVER=80
    if NOT EXIST "%PROGRAMFILES%\Microsoft SQL Server\80\Tools\BINN\osql.exe" (
      @echo MS SQL Server is not yet installed.
      pause
      exit
    )
  )
)
@echo Your SQL Server version is %SQLVER% (100=2008,90=2005, and 80=2000)    
if exist "%PROGRAMFILES%\Microsoft SQL Server\%SQLVER%\Tools\BINN\osql.exe" (
  "%PROGRAMFILES%\Microsoft SQL Server\%SQLVER%\Tools\BINN\osql" -E 
  -d "%PROJECT%PD_FSDB_ECitation" -h-1 -Q "select name from sysobjects where 
  type='U' order by name;" -o tableList.txt

需要更改上述查询以创建drop语句列表而不仅仅是表名。 tableList.sql文件只是一个简单的drop table语句列表。

生成queryList.sql之后,我想像这样运行它:

osql -E -h-1 -i C:\MyFolder\queryList.txt

我知道有一种方法可以从SQL语句生成SQL语句列表,但我不记得该怎么做。

4 个答案:

答案 0 :(得分:6)

为什么不使用系统存储过程sp_msforeachtable

从您的osql运行以下内容,您可以绕过许多额外的工作:

USE <databasename>
exec sp_msforeachtable 'DROP TABLE ?'

此proc基本上构建了一个游标,并在每个表的单引号内执行一次查询,将?替换为模式限定的表名,如dbo.table

答案 1 :(得分:2)

从SQL运行以下命令。从数据库中删除表格简单快捷:

USE <databasename>
exec sp_msforeachtable 'DROP TABLE ?'

答案 2 :(得分:1)

我不知道是否有命令可以执行此操作,但您可以更改select语句,以便为您创建drop语句:

select '--DROP TABLE ' + name + CHAR(10) + 'DROP TABLE ' + name + ' GO' from sysobjects where type='U' 

编辑:关于未指定架构的评论后:

SELECT '--DROP TABLE ' + TABLE_NAME + CHAR(10) + 'DROP TABLE ' + QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME)  
FROM INFORMATION_SCHEMA.TABLES 

编辑:正如Remus在评论中所建议的那样,添加了引号以使其不易受到sql注入攻击

答案 3 :(得分:0)

我是这样做的:

set SQLVER=100
if NOT EXIST "%PROGRAMFILES%\Microsoft SQL Server\100\Tools\BINN\osql.exe" (
  @echo MS SQL Server 2008 not found.
  set SQLVER=90
  if NOT EXIST "%PROGRAMFILES%\Microsoft SQL Server\90\Tools\BINN\osql.exe" (
    @echo MS SQL Server 2005 not found.
    set SQLVER=80
    if NOT EXIST "%PROGRAMFILES%\Microsoft SQL Server\80\Tools\BINN\osql.exe" (
      @echo MS SQL Server is not yet installed.
      pause
      exit
    )
  )
)
@echo Your SQL Server version is %SQLVER% (100=2008,90=2005, and 80=2000)

if exist "%PROGRAMFILES%\Microsoft SQL Server\%SQLVER%\Tools\BINN\osql.exe" (
  "%PROGRAMFILES%\Microsoft SQL Server\%SQLVER%\Tools\BINN\osql" -E -h-1 
 -d MYDB -Q "select 'DROP TABLE ' + CAST(name AS 
 VARCHAR(30)) + ';' from sysobjects where type='U';" -o queries.sql
  :: remove sql result count line
  type queries.sql | findstr /V rows > queryList.sql  
  :: rename Identity table in the sql script because it uses a keyword
  type queryList.sql | findstr /V /C:"TABLE Identity" > runQueries.sql
  echo DROP TABLE [Identity]; >> runQueries.sql
  "%PROGRAMFILES%\Microsoft SQL Server\%SQLVER%\Tools\BINN\osql" -E -h-1 
 -d MYDB -i runQueries.sql -o dropResults1.txt
)
pause
:: Cleanup
del queryList.sql
del dropResults1.txt
del dropResults2.txt
del runQueries.sql
del queries.sql
exit