我有TAB_A
表
COL_NAME DATATYPE MAX_LENGTH
A VARCHAR 255
B INT 4
C FLOAT 8
我想用DATATYPE
和MAX_LENGTH
在TAB_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将被更改。