Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于生成drop table语句列表的动态sql脚本_Sql_Sql Server_Tsql - Fatal编程技术网

用于生成drop table语句列表的动态sql脚本

用于生成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

我已经列出了需要从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);
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