T-SQL:变量NVARCHAR(MAX)?

时间:2015-07-13 15:45:49

标签: sql-server tsql

如何在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的类型时失败。

2 个答案:

答案 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)