2011-04-13 85 views
1

我有這個批處理文件,將所有表的列表輸出到一個文件。我正在尋找將輸入此列表的命令,並生成一個drop語句的完整列表以刪除所有表?從批處理文件中刪除SQL Server數據庫中的所有表?

:: 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語句列表的方式,但我不記得怎麼做。

回答

1

我不知道是否有一個命令做,但這樣它爲您創建drop語句,你可以改變你的SELECT語句:

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 

編輯:作爲萊姆斯提出的意見,增加QUOTENAME使其更不容易受到SQL注入

+0

那就是它!非常感謝。 – djangofan 2011-04-13 20:22:16

+0

@djangofan酷,請記住標記爲正確的請:-) – 2011-04-13 20:26:28

+0

謝謝你的答案。得到你的幫助後,我發佈了我的腳本。 – djangofan 2011-04-13 21:22:25

6

爲什麼不使用只用系統存儲的proc sp_msforeachtable

運行從OSQL下面,你可以繞過很多額外的工作,你正在做的:

USE <databasename> 
exec sp_msforeachtable 'DROP TABLE ?' 

這PROC基本上建立了一個光標,並執行單引號內的查詢一次爲每個表,用模式限定的表名替換?,如dbo.table

+0

這麼簡單但非常有效! – 2011-04-13 20:24:21

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 
2

運行從SQL以下。從您的數據庫中刪除表格很簡單快捷:

USE <databasename> 
exec sp_msforeachtable 'DROP TABLE ?' 
+0

它比編寫腳本的速度快,但是一旦腳本創建完畢,沒有什麼比雙擊桌面上的腳本更快的了。 – djangofan 2012-04-16 15:28:05

+0

@djangofan什麼阻止你將這些行放入腳本中? – Marcel 2012-10-15 06:47:48

+0

以防萬一您需要刪除視圖,以下是這是如何工作的:http://stackoverflow.com/a/11689661/79485 – Marcel 2013-02-01 13:51:59

相關問題