Удалить все таблицы в базе данных SQL Server из пакетного файла? - PullRequest
1 голос
/ 14 апреля 2011

У меня есть этот пакетный файл, который выводит список всех таблиц в файл. Я ищу команду, которая будет вводить этот список и генерировать целый список операторов отбрасывания, чтобы удалить все таблицы с?

:: 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 представляет собой простой список операторов отбрасывания таблиц.

После генерации queryList.sql я хочу запустить его так:

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

Я знаю, что есть способ создать список операторов SQL из оператора SQL, но я не помню, как это сделать.

Ответы [ 4 ]

6 голосов
/ 14 апреля 2011

Почему бы не использовать просто использовать системный хранимый процесс sp_msforeachtable?

Запустите следующее из своего osql, и вы сможете обойти большую часть дополнительной работы, которую вы делаете:

USE <databasename>
exec sp_msforeachtable 'DROP TABLE ?'

Этот процесс в основном создает курсор и выполняет запрос внутри одинарных кавычек один раз для каждой таблицы, заменяя ? на имя таблицы, дополненное схемой, например dbo.table.

2 голосов
/ 17 июня 2011

Запустите следующее из вашего SQL.Удалить таблицы из вашей БД просто и быстро:

USE <databasename>
exec sp_msforeachtable 'DROP TABLE ?'
1 голос
/ 14 апреля 2011

Я не знаю, есть ли команда для этого, но вы можете изменить свой оператор 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 

РЕДАКТИРОВАТЬ: Как Ремус предложил в комментариях, добавил quotename, чтобы сделать его менее уязвимым для SQL инъекций

0 голосов
/ 14 апреля 2011

Вот как я это сделал:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...