具有数据类型的sql server中的Dynamic Create列

时间:2016-05-02 12:19:22

标签: sql sql-server

我有表TAB_A

COL_NAME DATATYPE MAX_LENGTH
A        VARCHAR   255
B        INT        4
C        FLOAT      8

我想使用TAB_BDATATYPEMAX_LENGTH中创建A,B,C作为列。

TAB_B列如下所示:之前

X Y Z

我希望TAB_B看起来像这样:在

之后
X Y Z A B C

使用数据类型。

如何编写动态SQL,以便在现有表中创建A,B,C ......列。

2 个答案:

答案 0 :(得分:1)

尝试以下,

我创建了示例表,例如:

CREATE TABLE Tab_A
(
    COL_NAME       CHAR(1),
    DATATYPE       VARCHAR(100),
    MAX_LENGTH     INT
)

insert into Tab_A values('A',        'VARCHAR',   255)
insert into Tab_A values('B',        'INT' ,       4)
insert into Tab_A values('C',        'FLOAT'  ,    8)

现在我已经创建了其他表Tab_B,

CREATE TABLE Tab_B
(
    X       CHAR(1),
    Y       VARCHAR(100),
    Z     INT
)

SELECT * from Tab_B

现在,最后我正在使用动态查询

DECLARE @ColumnName AS NVARCHAR(MAX)
SELECT @ColumnName = ISNULL(@ColumnName + ',', '') 
       + QUOTENAME(COL_NAME) + ' ' + DATATYPE + CASE WHEN DATATYPE = 'INT' THEN '' ELSE '(' + CAST(MAX_LENGTH AS VARCHAR(10)) +')' END
FROM   (
           SELECT DISTINCT *
           FROM   Tab_A
       ) AS Courses

DECLARE @SQL VARCHAR(1000)
SELECT @SQL = 'ALTER TABLE Tab_B ADD ' + @ColumnName + ''
EXEC (@SQL)
SELECT * FROM   Tab_B

答案 1 :(得分:1)

此语句将提供所需的查询:

DECLARE @TAB_A SYSNAME = 'dbo.Tab_A'
, @TAB_B SYSNAME = 'dbo.Tab_B'

DECLARE @dynsql NVARCHAR(MAX)
SELECT @dynsql = COALESCE(@dynsql,'') + qry
FROM (
SELECT
'ALTER TABLE ' + @TAB_B + ' ADD COLUMN '
+ COLUMN_NAME
+ ' ' + DATA_TYPE
+ CASE WHEN CHARACTER_MAXIMUM_LENGTH IS NULL THEN ' ' WHEN CHARACTER_MAXIMUM_LENGTH = -1 THEN '(MAX) ' ELSE '(' + CAST(CHARACTER_MAXIMUM_LENGTH AS VARCHAR(10)) + ') ' END
+ CASE WHEN IS_NULLABLE = 'NO' THEN 'NOT NULL' ELSE 'NULL' END
+ CASE WHEN COLUMN_DEFAULT IS NULL THEN '' ELSE ' DEFAULT ' + COLUMN_DEFAULT END
+ '; ' AS qry
from INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = PARSENAME(@TAB_A,1)
AND TABLE_SCHEMA = COALESCE(PARSENAME(@TAB_A,2),'dbo')
) r

SELECT @dynsql

现在您也可以替换

SELECT @dynsql

EXEC(@dynsql)

但请注意,执行时会更改您的表A.