SQL Server 2008 необходимо создать оператор создания таблицы типа пользователя с оператором SQL - PullRequest
3 голосов
/ 02 февраля 2012

Мне нужно создать тип таблицы пользователя. Я предпочитаю использовать один оператор SQL. Не обращая внимания на навороты, которые можно отнести к такому оператору create, я сначала вывел логику для генерации оператора 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 столбцов. Кажется, что это должно быть возможно, но я не смог выработать логику.

1 Ответ

2 голосов
/ 02 февраля 2012

Вы можете использовать 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
...