如何解决从批处理文件中删除SQL Server数据库中的所有表?
| 我有此批处理文件,可将所有表的列表输出到文件。我正在寻找将输入此列表并生成整个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文件只是放置表语句的简单列表。
生成queryList.sql之后,我想这样运行它:
osql -E -h-1 -i C:\\MyFolder\\queryList.txt
我知道有一种从sql语句生成sql语句列表的方法,但是我不记得该怎么做。
解决方法
我不知道是否有执行此操作的命令,但是您可以更改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注入
,为什么不只使用系统存储的过程sp_msforeachtable
?
从osql运行以下命令,您可以绕开许多正在做的额外工作:
USE <databasename>
exec sp_msforeachtable \'DROP TABLE ?\'
此proc基本上会构建一个游标,并为每个表在单引号内执行一次查询,将?
替换为模式限定的表名,例如dbo.table
。
,从您的SQL运行以下命令。从数据库中删除表既简单又快速:
USE <databasename>
exec sp_msforeachtable \'DROP TABLE ?\'
,这是我的做法:
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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。