本文介紹了如何使用另一個表中的列名創建表?的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
我正在使用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
語句將失敗。
這篇關于如何使用另一個表中的列名創建表?的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,