sql-server - 如何使用以下查询维护 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)
提前致谢..!!!!!
解决方案
您可以维护一isexist
列,然后在执行或查询后JOIN
对其进行更新sys.columns
create table
alter 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, ', ') +
' );'