Sql server SQL Server检查表达式的结果数据类型

Sql server SQL Server检查表达式的结果数据类型,sql-server,tsql,types,Sql Server,Tsql,Types,通常我会将数据类型放入临时表中,并检查表列类型,例如 select 1.0 N into tbl sp_help tbl N列随后显示表达式1.0的数据类型。(这只是一个简单的例子) 有一个SQL函数可以直接检查表达式的数据类型,但我现在不知道这个名称 这个函数的名称是什么?我能想到的只有和函数 当传递表达式时,它们将返回1/0。不幸的是,如果给我一个表达式,我想不出任何东西会返回这个类型 更新: 试试看!我想这就是你要找的。很难找到……我从未见过这样的功能 从MSDN关于以下内容的文章:

通常我会将数据类型放入临时表中,并检查表列类型,例如

select 1.0 N into tbl

sp_help tbl
N列随后显示表达式
1.0
的数据类型。(这只是一个简单的例子)

有一个SQL函数可以直接检查表达式的数据类型,但我现在不知道这个名称


这个函数的名称是什么?

我能想到的只有和函数

当传递表达式时,它们将返回1/0。不幸的是,如果给我一个表达式,我想不出任何东西会返回这个类型

更新:


试试看!我想这就是你要找的。很难找到……

我从未见过这样的功能

从MSDN关于以下内容的文章:

对于由 单个常量、变量、标量 函数或列名:数据 类型、排序规则、精度、比例和 表达式的值是数据 类型、排序规则、精度、比例和 引用元素的值

当两个表达式由 使用比较运算符或逻辑运算符, 结果数据类型为布尔型和 该值为以下值之一: 真的、假的或未知的。更多 有关布尔数据类型的信息, 请参阅比较运算符 (Transact-SQL)

当两个表达式由 使用算术、按位或字符串 运算符,该运算符确定 结果数据类型

由许多元素组成的复杂表达式 符号和运算符的计算结果为a 单值结果。数据类型, 的排序规则、精度和值 结果表达式由 组合组件表达式, 一次两个,直到最终结果出来 达到。事件发生的顺序 表达式的组合定义为 中运算符的优先级 表情

近在咫尺

DECLARE @what sql_variant;
DECLARE @foo decimal(19,3) = 1, @bar decimal(11,7) = 2;

SELECT @what = @foo / @bar;
SELECT
    SQL_VARIANT_PROPERTY(@what, 'BaseType'),
    SQL_VARIANT_PROPERTY(@what, 'Precision'),
    SQL_VARIANT_PROPERTY(@what, 'Scale'),
    SQL_VARIANT_PROPERTY(@what, 'MaxLength');

SELECT @what = @foo + @bar;
SELECT
    SQL_VARIANT_PROPERTY(@what, 'BaseType'),
    SQL_VARIANT_PROPERTY(@what, 'Precision'),
    SQL_VARIANT_PROPERTY(@what, 'Scale'),
    SQL_VARIANT_PROPERTY(@what, 'MaxLength');


SELECT @what = @foo * @bar;
SELECT
    SQL_VARIANT_PROPERTY(@what, 'BaseType'),
    SQL_VARIANT_PROPERTY(@what, 'Precision'),
    SQL_VARIANT_PROPERTY(@what, 'Scale'),
    SQL_VARIANT_PROPERTY(@what, 'MaxLength');
或临时表/选择..进入。。作为你已经做过的事情的延伸


编辑:

现在您有了-请参见gbnanswer@cyberkiwi:是的,他的答案很接近,我投了更高的票,但最初的帖子要求一个函数来直接计算表达式。据我所知,没有。您可以查看有关类型的信息(TYPEPROPERTY)。或列(sys.columns等),但不是随机表达式,除非是计算列。表达式本身没有持久性,除非它是一个列:您还想知道决定论等,它仅对问题中所述的列有效,使用
selectsql\u variant\u属性(1.0,'basetype')
告诉我sql将其视为数字类型。这是一个完美的匹配。值得注意的是,有一些类型不适用于此,例如nvarchar(max)。此外,nvarchar结果的maxlength增加了一倍,因此nvarchar(7)显示了14个字节,这是有意义的,但需要注意的是。