2012-02-02 4 views
3

ユーザテーブルタイプを作成する必要があります。私の好みは、単一のSQLステートメントを使用することです。SQL Server 2008は、SQL文を使用してユーザテーブルタイプのcreate文を作成する必要があります。

select 'create type ' + tt.name + ' as TABLE (' + c.name + ' ' + t.name + 
case 
when t.name in ('varchar','char','nvarchar','nchar','binary','varbinary') then 
    '(' + 
     case 
     when c.max_length = -1 then 'MAX' 
     else convert(varchar, c.max_length) 
     end + ')' 
    when t.name in ('numeric','decimal') then 
     '(' + convert(varchar, c.precision) + ',' + convert(varchar, c.scale) + ')' 
    else '' 
end + ')' 
from sys.table_types tt 
join sys.columns c 
on tt.type_table_object_id = c.object_id 
join sys.types t 
on c.system_type_id = t.system_type_id and 
c.user_type_id = t.user_type_id 

これは、データ型の点で適用範囲が限定されています。私は最初の文を使用して単一列テーブルのステートメントを作成生成するロジックを派生文を作成するように帰することができる添えものを無視今は十分です。私が理解しようとしているのは、テーブルの列定義を作成するステートメントが1〜n個の列を処理するための内部ループのようなものになるように拡張することです。それは可能でなければならないようですが、私は論理を解明できませんでした。

+5

助けを得る機会を増やすには、前の8つの質問のいくつかに対する回答を受け入れることができます。 – Aaron

+3

うわー、ゼロ%、ええ?私は答えに嘘をつきたい。 ;) –

+0

'scholar'バッジは嫌いですか? – Oybek

答えて

2

for xml path文字列連結トリックを使用できます。

select 'create type ' + tt.name + ' as TABLE (' + 
    stuff((select ', '+c.name + ' ' + t.name + 
        case when t.name in ('varchar','char','nvarchar','nchar','binary','varbinary') 
         then '(' + case when c.max_length = -1 
             then 'MAX' 
             else convert(varchar, c.max_length) 
            end + ')' 
         when t.name in ('numeric','decimal') 
         then '(' + convert(varchar, c.precision) + ',' + convert(varchar, c.scale) + ')' 
         else '' 
        end 
      from sys.columns c 
      inner join sys.types t 
       on c.system_type_id = t.system_type_id and 
        c.user_type_id = t.user_type_id   
      where c.object_id = tt.type_table_object_id 
      for xml path(''), type  
     ).value('.', 'varchar(max)'), 1, 2, '')+ ')' 
from sys.table_types tt 
+1

+1私は 'xml'と' sql'を混ぜているように見えますか?と驚いています。それを自分自身で試してみると、私の冒涜レベルは屋根の中で撃ちます... –

関連する問題