2016-05-02 4 views
1

У меня есть таблица TAB_ADynamic Создать столбец в SQL сервера с типом данных

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

Я хочу создать A, B, C, как в колонке TAB_B с DATATYPE и MAX_LENGTH.

В TAB_B столбцы выглядеть следующим образом: Перед

X Y Z 

Я хочу TAB_B выглядеть следующим образом: После

X Y Z A B C 

с типом данных.

Как написать динамический SQL, чтобы мои столбцы A, B, C, ... создавались в существующей таблице.

+0

Добавить пример данных таблицы и ожидаемый результат. – jarlh

ответ

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 
+0

спасибо pedram .... все идеально, но длина данных не подходит – Jack

+0

@Jack - пожалуйста, проверьте сейчас. Я обновил свой ответ – pedram

+0

для int мы получили ошибку ... как ... Столбец, параметр или переменная # 5: Невозможно указать ширину столбца для типа данных int. – Jack

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) 

но имейте в виду, что ваша таблица А будет изменяться при выполнении.

+0

Он меняет только существующий столбец, а не добавляет новый – Jack

+0

, он добавляет новые столбцы –

Смежные вопросы