Tsql 选择结果中的动态数据类型

Tsql 选择结果中的动态数据类型,tsql,Tsql,这是一个标量查询,最初位于函数中。结果数据类型会有所不同,具体取决于我感兴趣的字段 在本例中,我希望得到数据类型为NVARCHAR'Andy'的标量结果,但得到一个错误: 转换时,Msg 245,16级,状态1,第xx行转换失败 nvarchar值“Andy”转换为数据类型int 有没有办法绕过这个问题 CREATE TABLE ATable ( Idf INT PRIMARY KEY, Col1 INT, Col2 NVARCHAR(255), ) GO INSERT INTO

这是一个标量查询,最初位于函数中。结果数据类型会有所不同,具体取决于我感兴趣的字段

在本例中,我希望得到数据类型为NVARCHAR'Andy'的标量结果,但得到一个错误:

转换时,Msg 245,16级,状态1,第xx行转换失败 nvarchar值“Andy”转换为数据类型int

有没有办法绕过这个问题

CREATE TABLE ATable (
  Idf INT PRIMARY KEY,
  Col1 INT,
  Col2 NVARCHAR(255),
)
GO

INSERT INTO Atable (Idf, Col1, Col2) VALUES (1, 75, 'Andy')
INSERT INTO Atable (Idf, Col1, Col2) VALUES (2, 39, 'Pete')
GO

DECLARE @Idf INT = 1
DECLARE @Col NVARCHAR(15) = 'Col2'

SELECT
  CASE
    WHEN @Col='Col1' THEN Col1
    WHEN @Col='Col2' THEN Col2
    ELSE NULL
  END AS MyScalarResultOfDynamicDatatype
FROM ATable
WHERE Idf=@Idf

如果真的,真的有必要。。。您可以使用数据类型

CASE
  WHEN @Col='Col1' THEN CAST(Col1 AS SQL_VARIANT)
  WHEN @Col='Col2' THEN CAST(Col2 AS SQL_VARIANT)
END AS MyScalarResultOfDynamicDatatype
(请注意,在您的
案例
-语句中并不特别需要
ELSE NULL
。如果在时没有匹配的
,默认情况下结果将为
NULL
。)

编辑:


基于评论中关于缺点的问题,我想参考一篇文章,该文章由某人以别名(,)撰写。

这正是我想要的。谢谢当然,这是没有必要的,但如果这样做,代码将是简短的、可读的和干净的。有什么严重的缺点吗?我编辑了我的问题,引用了一篇有趣的文章,指出了使用
sql\u变量
数据类型的一些缺点。