Tsql 选择结果中的动态数据类型
这是一个标量查询,最初位于函数中。结果数据类型会有所不同,具体取决于我感兴趣的字段 在本例中,我希望得到数据类型为NVARCHAR'Andy'的标量结果,但得到一个错误: 转换时,Msg 245,16级,状态1,第xx行转换失败 nvarchar值“Andy”转换为数据类型int 有没有办法绕过这个问题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
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变量
数据类型的一些缺点。