首页 > 解决方案 > 如何使用以下查询维护 isactive 标志

问题描述

我有一个表,其中包含列名数据类型表名、状态和 isactive 标志等数据。

我必须从此表中读取数据并创建一个查询,该查询将根据表中给出的信息工作。

像给定列名一样,给定表名,如果状态是新的,那么我必须创建一个新表,并在我的数据表中给出列名和数据类型。如果状态是旧的,那么我必须运行 alter 命令并添加一个给出名称和数据类型的列。但我的问题是我应该如何在我的数据表中维护标志,所以在行中执行后,它将在下一行中执行,而不是在所有行中再次执行,否则如果我们再次创建,它将给出表名已经存在的错误。如果列在数据表中有是,我应该如何创建主键。

数据表:

柱子 数据类型 表名 地位 主键 活跃
姓名 varchar(10) 雇员 新的 1
ID 整数 雇员 新的 是的 1
电子邮件 varchar(250) 细节 老的 1

到目前为止,我有以下解决方案

 DECLARE @temp nvarchar(max) = 
(SELECT STRING_AGG(query, ' ')
FROM (
    SELECT
        query = 'CREATE TABLE ' + 
            QUOTENAME(table_name) +
            ' ( ' +
            STRING_AGG(QUOTENAME(cl) + ' ' + data_type , ', ') +
            ' );'

    FROM dataset
    WHERE status = 'new' 
    GROUP BY table_name
) AS v); 

SET @temp = @temp + 
(SELECT STRING_AGG(query,' ')
FROM (
    SELECT
        query = 'ALTER TABLE ' + 
            QUOTENAME(table_name) +
            ' ADD ' +
            
            STRING_AGG(QUOTENAME(cl) + ' ' + data_type  ,  ', ') 
            
    FROM dataset
    WHERE status = 'old' 
    GROUP BY table_name
) AS v);

print(@sql)
EXEC(@temp)

这是解决方案,但在此我应该如何进行更改,以便在执行后将标志更新为 0,并且如果我们的数据表在主键中有是,则还将列添加为主键。

这是成功执行后的@temp:

CREATE TABLE [emp] ( [name] varchar(10), [id] int ); ALTER TABLE [details ] ADD [email] varchar(250)

提前致谢..!!!!!

标签: sql-server

解决方案


您可以维护一isexist列,然后在执行或查询后JOIN对其进行更新sys.columnscreate tablealter table

update  t
set     isexist = 1
from    data_table t
        inner join sys.columns c    on  c.object_id = object_id(t.tablename)
                                    and c.name      = t.[column]

在主键上,使用case语句检查标志并相应地primary key在列数据类型之后附加关键字

CASE WHEN primarykey = 'yes' THEN ' primary key' ELSE '' END

合并到您的查询中(未经测试)

query = 'CREATE TABLE ' + 
            QUOTENAME(table_name) +
            ' ( ' +
            STRING_AGG(QUOTENAME(cl) + ' ' + data_type , 
              CASE WHEN primarykey = 'yes'
                   THEN ' primary key'
                   ELSE ''
                   END, ', ') +
            ' );'

推荐阅读