如何在t-sql中获取列或变量的实际类型?
我知道SQL_VARIANT_PROPERTY
,但这对NVARCHAR(MAX)
:
DECLARE @foo1 NVARCHAR(10) = N'a'
SELECT SQL_VARIANT_PROPERTY(@foo1, 'BaseType') --works fine
DECLARE @foo2 NVARCHAR(MAX) = N'a'
SELECT SQL_VARIANT_PROPERTY(@foo2, 'BaseType') --fails with an error:
--Operand type clash: nvarchar(max) is incompatible with sql_variant
如果变量包含NVARCHAR(MAX)
类型的值,还有什么能够告诉我吗?
一些背景知识:
我正在处理一个应该重新排序表的列的过程:重命名旧表,创建一个新表,复制数据并删除旧表。为此,需要在新表上重新创建所有索引,视图,约束等。
我想确保在此自动过程中不会丢失任何内容。为此,我想将相关系统表中的大多数值复制到通用临时表,并比较重新排序后的值。这现在完全正常,但在尝试检测nvarchar(max)-columns的类型时失败。
答案 0 :(得分:2)
安德烈亚斯,
如果您要查找列的数据类型和长度,则可以使用以下代码。 注意,使用-1,其中在模式中声明(max)。 添加WHERE子句以指定表名或列名
SELECT tb.name TableName, cl.name ColumnName
, cl.system_type_id, ty.name, cl.max_length
FROM sys.columns cl
INNER JOIN sys.tables tb ON tb.object_id = cl.object_id
INNER JOIN sys.types ty ON cl.system_type_id = ty.system_type_id
ORDER BY cl.max_length
答案 1 :(得分:0)
sql_variant无法存储nvarchar(max),Sql_variant支持字符串
它也不会存储这种类型
varchar(max)
varbinary(max)
nvarchar(max)
xml
text
等...
而不是转到
nvarchar(4000) but not nvarchar(max).
varchar(8000) but not varchar(max)