SQL Server 2008需要使用SQL语句创建用户表类型的创建语句。

3

我需要创建一个用户表类型,我的首选是使用单个SQL语句。忽略可以归因于此类创建语句的花哨附加功能,我首先推导出用于生成单列表的创建语句的逻辑如下:

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
哇,零百分比,嗯?这让我想在回答中撒谎。 ;) - Nick Vaccaro
不喜欢“学者”徽章吗? - Oybek
1个回答

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 我仍然惊讶于您似乎如此轻松地将 xmlsql 混合使用。而我自己尝试时,仍然会让我不停地发出脏话... - Lieven Keersmaekers

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接