1

I have table TAB_A

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

I want to create A,B,C as column in TAB_B with DATATYPE and MAX_LENGTH.

The TAB_B columns look like this: Before

X Y Z

I want the TAB_B look like this: After

X Y Z A B C

with datatype.

How can I write dynamic SQL so my A,B,C,... columns will get created in existing table.

1
  • Add sample table data, and the expected result. Commented May 2, 2016 at 12:25

2 Answers 2

1

Try below,

I have created sample table like your example:

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)

Now I have created other table Tab_B,

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

SELECT * from Tab_B

Now, Finally I'm using dynamic query,

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
Sign up to request clarification or add additional context in comments.

6 Comments

for int we got error...like ...Column, parameter, or variable #5: Cannot specify a column width on data type int.
There is no INT(4) data type in SQL server. So please check my updated answer.
thanks, but this is temp because if datatype is date or bigint then the same prob....where can i get list of fixed length datatype in sql server. so i can make this is my answer
can you please check this technet.microsoft.com/en-us/library/aa258271(v=sql.80).aspx - for type int you should make tinyint,smallint,int,bigint,real
also try this SELECT * FROM sys.types to get all data types
|
1

This statement will provide the desired query:

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

Now you can also replace the

SELECT @dynsql

with

EXEC(@dynsql)

but be aware that your table A will be altered when executing.

1 Comment

It alter my existing column only, and not adding new one

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.