【问题标题】:Drop all tables in a SQL Server database from Batch file?从批处理文件中删除 SQL Server 数据库中的所有表?
【发布时间】:2011-06-17 22:46:12
【问题描述】:

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

:: 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

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

    为什么不直接使用系统存储的procsp_msforeachtable

    从您的 osql 中运行以下命令,您可以绕过很多额外的工作:

    USE <databasename>
    exec sp_msforeachtable 'DROP TABLE ?'
    

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

    【讨论】:

      【解决方案2】:

      从您的 SQL 运行以下命令。从数据库中删除表既简单又快速:

      USE <databasename>
      exec sp_msforeachtable 'DROP TABLE ?'
      

      【讨论】:

      • 比写脚本快是的,但是一旦创建了脚本,没有什么比双击桌面上的脚本更快的了。
      • @djangofan 是什么阻止您将这些行放入脚本中?
      • 以防万一您也需要删除视图,这就是它的工作原理:stackoverflow.com/a/11689661/79485
      【解决方案3】:

      我不知道是否有执行此操作的命令,但您可以更改您的 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 在 cmets 中建议的那样,添加了 quotename 以使其不易受到 sql 注入的影响

      【讨论】:

      • 感谢您的回答。得到您的帮助后,我发布了完成的脚本。
      • -1 因为模式不正确(脚本不考虑表模式,只考虑名称),更糟糕的是,容易发生 SQL 注入
      • @Remus Rusanu 哪里会引入sql注入?
      • 修复很简单,只需使用正确的引号,QUOTENAME(TABLE_SCHEMA)QUOTENAME(TABLE_NAME)
      • 作为一般规则:“我认为有人会利用它”绝不是在代码中留下已知缺陷的借口。修复它,然后你就会知道没有人会利用它。
      【解决方案4】:

      我是这样做的:

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多