我有表TAB_A
COL_NAME DATATYPE MAX_LENGTH
A VARCHAR 255
B INT 4
C FLOAT 8
我想使用TAB_B
和DATATYPE
在MAX_LENGTH
中创建A,B,C作为列。
TAB_B
列如下所示:之前
X Y Z
我希望TAB_B
看起来像这样:在
X Y Z A B C
使用数据类型。
如何编写动态SQL,以便在现有表中创建A,B,C ......列。
答案 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.