2016-05-02 10 views
1

とSQL Serverの列を作成します。私は、テーブルTAB_A動的データ型

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

を持っている私はDATATYPETAB_BMAX_LENGTHの列としてA、B、Cを作成したいです。

TAB_B列は次のようになります。データ型と

X Y Z A B C 

後:

X Y Z 

前に、私はこのようなTAB_Bを見て欲しいです。

私のA、B、C、...列が既存のテーブルに作成されるように、どのように動的SQLを記述できますか。

+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

私たちはエラーを持っている...のような...列、パラメータ、または変数#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 

今、あなたはまた、

EXEC(@dynsql) 

SELECT @dynsql 

を交換するが、実行するときに、あなたのテーブルAが変更されることに注意してくださいすることができます。

+0

既存の列のみを変更し、新しい列を追加しない – Jack

+0

新しい列を追加する –

関連する問題