如何动态获取SQL Server中列的完整数据类型?

时间:2018-07-11 10:13:16

标签: sql-server-2012 dynamic-sql

在SQL Server中,有时我需要获取表中列的确切数据类型。特别是在构建动态SQL时,这是因为我要创建具有完全相同的数据类型(包括长度,精度等)的变量,表变量,游标等。

我知道此信息部分可在information_schema.columns和sys.columns中获得,但是它们都是原始格式,需要转换魔术才能获取完整的数据类型。例如nvarchar(max)看起来像nvarchar(-1)。

我提出了2个错误的解决方案:

  1. 编写并维护一个视图定义,该定义在顶部执行所需的逻辑 SQL Server自己的系统表
  2. SMO确实能够以正确的格式访问完整的信息,但是需要我引入诸如PowerShell的辅助语言来调用它,并可能还要解析输出。

有什么好的方法来获取SQL Server中列的完整数据类型吗?

如果没有一种好的方法,那么有人有SQL处理所有内置数据类型的此问题吗?

或者谁可以验证它是否完整:

select 
    case
        when data_type in ('bigint', 'int', 'smallint', 'tinyint', 'bit', 'money', 'smallmoney', 'float', 'real') 
            then data_type
        when data_type in ('nvarchar', 'varchar', 'nchar', 'char') and character_maximum_length > 0
            then data_type + '(' + cast(character_maximum_length as nvarchar) + ')'
        when data_type in ('nvarchar', 'varchar') and character_maximum_length = -1
            then data_type + '(max)'
        when data_type in ('datetime2', 'datetime') 
            then data_type + '(' + cast(datetime_precision as nvarchar) + ')'
        when data_type = 'text' then 'varchar(max)' 
        when data_type = 'ntext' then 'nvarchar(max)'
        when data_type = 'image' then 'varbinary(max)'
        when data_type in ('decimal', 'numeric') and numeric_scale = 0
            then data_type + '(' + cast(numeric_precision as nvarchar) + ')'
        when data_type in ('decimal', 'numeric') and numeric_scale > 0
            then data_type + '(' + cast(numeric_precision as nvarchar) + ',' + cast(numeric_scale as nvarchar) + ')'    
        else '<ERROR UNRESOLVED DATATYPE>'
    end as complete_data_type, *
from information_schema.columns

0 个答案:

没有答案