用于生成drop table语句列表的动态sql脚本
我已经列出了需要从SQLServer中删除的大约100++的表。下面是我将使用的示例代码用于生成drop table语句列表的动态sql脚本,sql,sql-server,tsql,Sql,Sql Server,Tsql,我已经列出了需要从SQLServer中删除的大约100++的表。下面是我将使用的示例代码 IF OBJECT_ID('dbo.DS_Area_TBL', 'U') IS NOT NULL drop table dbo.DS_Area_TBL Print 'dbo.DS_Area_TBL has been dropped' 我需要用其他表名替换表名100++time。如何编写能够自动生成查询列表的动态sql脚本?您可以先生成脚本,然后使用动态sql执行: CREATE TABLE a(a INT
IF OBJECT_ID('dbo.DS_Area_TBL', 'U') IS NOT NULL
drop table dbo.DS_Area_TBL
Print 'dbo.DS_Area_TBL has been dropped'
我需要用其他表名替换表名100++time。如何编写能够自动生成查询列表的动态sql脚本?您可以先生成脚本,然后使用动态sql执行:
CREATE TABLE a(a INT);
CREATE TABLE b(a INT);
CREATE TABLE c(a INT);
CREATE TABLE d(a INT);
CREATE TABLE e(a INT);
CREATE TABLE tab(tab_name SYSNAME); -- here are table names stored
INSERT INTO tab VALUES ('a'),('b'),('c'),('d'),('e');
-- main part
DECLARE @sql NVARCHAR(MAX);
SELECT @sql = STUFF((SELECT ' ' + FORMATMESSAGE(
'IF OBJECT_ID(''%s'', ''U'') IS NOT NULL
BEGIN
DROP TABLE %s;
PRINT ''%s has been dropped '';
END
', QUOTENAME(tab_name),QUOTENAME(tab_name),QUOTENAME(tab_name))
FROM tab
FOR XML PATH('')), 1, 1, '');
PRINT @sql; -- for debug
EXEC [dbo].[sp_executesql]
@sql;
如果使用低于2012的SQL Server版本,则需要使用字符串连接+更改FORMATMESSAGE
通过修改模板,您可以轻松地使用自定义架构等扩展此脚本:
'IF OBJECT_ID(''%s'', ''U'') IS NOT NULL
BEGIN
DROP TABLE %s;
PRINT ''%s has been dropped '';
END
'
输出:
IF OBJECT_ID('[a]', 'U') IS NOT NULL
BEGIN
DROP TABLE [a];
PRINT '[a] has been dropped ';
END
IF OBJECT_ID('[b]', 'U') IS NOT NULL
BEGIN
DROP TABLE [b];
PRINT '[b] has been dropped ';
END
IF OBJECT_ID('[c]', 'U') IS NOT NULL
BEGIN
DROP TABLE [c];
PRINT '[c] has been dropped ';
END
IF OBJECT_ID('[d]', 'U') IS NOT NULL
BEGIN
DROP TABLE [d];
PRINT '[d] has been dropped ';
END
IF OBJECT_ID('[e]', 'U') IS NOT NULL
BEGIN
DROP TABLE [e];
PRINT '[e] has been dropped ';
END
编辑:
工作原理:
是SQL Server的常用习惯用法,类似于MySQL中的GROUP_CONCAT。您可以将其视为一种将多个IF-BEGIN-END块组合成一个字符串的方法。
将用实际引用的表名称替换%s,以避免SQL注入攻击
打印是为了调试检查生成的查询,可以进行注释
将执行SQL字符串
输出-
IF OBJECT_ID('[dbo].[user_data]', 'U') IS NOT NULL BEGIN
DROP TABLE [dbo].[user_data]
PRINT '[dbo].[user_data] has been dropped'
END
IF OBJECT_ID('[dbo].[formatter_options]', 'U') IS NOT NULL BEGIN
DROP TABLE [dbo].[formatter_options]
PRINT '[dbo].[formatter_options] has been dropped'
END
引用是一种非常受欢迎的方式;谢谢你的回答!!!你能给我解释一下这个语句是如何生成代码的吗?STUFFSELECT“”+FORMATMESSAGE“如果对象\U ID%s,U不为空,则开始删除表%s;已删除打印%s;END',QUOTENAMEtab U名称,QUOTENAMEtab U名称,QUOTENAMEtab U名称来自XML路径的选项卡,1,1;
IF OBJECT_ID('[dbo].[user_data]', 'U') IS NOT NULL BEGIN
DROP TABLE [dbo].[user_data]
PRINT '[dbo].[user_data] has been dropped'
END
IF OBJECT_ID('[dbo].[formatter_options]', 'U') IS NOT NULL BEGIN
DROP TABLE [dbo].[formatter_options]
PRINT '[dbo].[formatter_options] has been dropped'
END