我需要创建一个用户表类型,我的首选是使用单个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列。看起来应该是可能的,但我还没有能够弄清楚逻辑。