如何使用另一个表中的列名创建表?

2022-07-24 00:00:00 select insert sql-server

我正在使用SQL Server 2016。
我想知道有没有什么方法可以用另一个表中的列名创建永久或临时表?
见下表:MAINTAGS及其代码。我想让道布当我的第一专栏,POB当第二专栏,以此类推…
我的MAINTAGS表中当前有12个名称,因此新表将总共有12列。

还可以在MAINTAGS中添加更多名称

ID_MAINTAGS NAMES_MAINTAGS
= 1道布
2 POB
3公民
4国籍
5其他制裁信息
6护照
7身份证号
8电子邮件地址
9性别
10又称
11链接至:
12电话号码

IF OBJECT_ID('dbo.MAINTAGS', 'U') IS NOT NULL 
  DROP TABLE dbo.MAINTAGS; 

CREATE TABLE MAINTAGS(ID_MAINTAGS INT IDENTITY(1,1), NAMES_MAINTAGS VARCHAR(MAX));

INSERT INTO MAINTAGS (NAMES_MAINTAGS)
VALUES
('DOB'),('POB'),('citizen'),('nationality'),
('Additional Sanctions Information'), ('Passport'),('National ID No.'),
('Email Address'),('Gender'),('a.k.a.'),('Linked To: ')

解决方案

让我首先说明这闻起来很像XY Problem,而您想要这样做的事实强烈表明这是设计缺陷。

我还将假定您有定义数据类型的内容;我将使用具有数据类型、长度、精度和小数位数属性的一些列。如果您没有,请添加它们。

无论如何,您可以通过一些简单的字符串聚合来实现这一点,然后执行动态语句:

DECLARE @SchemaName sysname = N'dbo',
        @TableName sysname = N'NewTableName';

DECLARE @SQL nvarchar(MAX),
        @CRLF nchar(2) = NCHAR(13) + NCHAR(10);

DECLARE @Delimiter = N',' + @CRLF;

SELECT @SQL = N'CREATE TABLE ' + QUOTENAME(@SchemaName) + N'.' + QUOTENAME(@TableName) + N'(' + @CRLF +
              STRING_AGG(N'    ' + QUOTENAME(YT.ColumnName) + N' ' + QUOTENAME(YT.DataType) + 
              CASE WHEN YT.Length IS NOT NULL OR YT.Precision IS NOT NULL OR YT.Scale IS NOT NULL THEN N' (' + CONCAT_WS(',',YT.Length,YT.Precision,YT.Scale) + N')' ELSE N'' END,@Delim)
FROM dbo.YourTable YT;

--PRINT @SQL --Your best friend.
EXEC sys.sp_executesql @SQL;

请注意,在您的示例中,NAMES_MAINTAGS列最多允许~20亿个字符;对象名称不能这么长。因此,这些值将被截断为128个字符;如果因此您有重复的名称,CREATE语句将失败。

相关文章