在sql server中动态创建数据类型为的列



我有TAB_A

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

我想用DATATYPEMAX_LENGTHTAB_B中创建A、B、C列。

TAB_B列如下所示:之前

X Y Z

我希望TAB_B看起来像这样:之后

X Y Z A B C

数据类型为。

如何编写动态SQL,使我的A、B、C,。。。列将在现有表中创建。

试试下面的

我已经创建了像您的示例一样的示例表:

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

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

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将被更改。

最新更新