在SQL Server中,有时我需要获取表中列的确切数据类型。特别是在构建动态SQL时,这是因为我要创建具有完全相同的数据类型(包括长度,精度等)的变量,表变量,游标等。
我知道此信息部分可在information_schema.columns和sys.columns中获得,但是它们都是原始格式,需要转换魔术才能获取完整的数据类型。例如nvarchar(max)看起来像nvarchar(-1)。
我提出了2个错误的解决方案:
有什么好的方法来获取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