T-SQL:变量是否为NVARCHAR(MAX)?

3

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


2
你得到了什么错误?(我知道是什么,但它应该是问题的一部分) - Kritner
相关:https://dev59.com/4msz5IYBdhLWcg3wVGPJ - Kritner
@Kritner:添加了错误信息。 - Andreas
试图理解何时需要这个东西--如果它是一个局部变量,那么你可以在代码中定义它。如果它是一列,那就有其他方法来查找类型信息。 - Hogan
@Hogan:我正在处理sys-tables和一个列名的字符串列表,这些应该被复制到一个临时表中。不幸的是,sys-tables没有关于sys-tables的元信息。 - Andreas
显示剩余3条评论
2个回答

2

Andreas,

如果您想发现列的数据类型和长度,则可以使用以下代码。 请注意,在模式中指定(max)的地方使用-1。 添加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

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)

我愿意这样做,但我需要先知道变量的类型。这是通用代码,从sys-table获取值(sys.columns不包含有关这些列的信息),并应将其存储在sql_variant中。但为了仅对正确的列进行转换,我需要知道类型。 - Andreas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接