Joe*_*ish 9 sql-server table-valued-parameters sql-server-2019
我正在 SQL Server 2019 CU14 上进行测试。考虑针对兼容级别为 130 或 140 的 SQL Server 数据库创建的以下表值函数:
-- requires database compat 130 or 140 to see the issue
CREATE OR ALTER FUNCTION [dbo].[TVF_BUG_REPRO_2] (@O DateTime, @Z varchar(50))
RETURNS TABLE
WITH SCHEMABINDING
AS
RETURN
SELECT
CAST(
CASE
WHEN SZ.Zone1 > '' THEN (@O at time zone SZ.Zone1) at time zone 'Pacific Standard Time'
WHEN LEN(@Z) > 3 THEN (@O at time zone @Z) at time zone 'Pacific Standard Time'
ELSE @O
END AS DATETIME
) ConvertedDate
FROM (SELECT CASE @Z WHEN 'ET' THEN 'Eastern Standard Time' ELSE NULL END Zone1) SZ;
Run Code Online (Sandbox Code Playgroud)
以下查询执行时没有错误并返回预期结果:
SELECT * FROM [dbo].[TVF_BUG_REPRO_2] ('2022-01-10 16:16:51.327', 'ET');
Run Code Online (Sandbox Code Playgroud)
以下查询意外引发错误:
SELECT * FROM [dbo].[TVF_BUG_REPRO_2] (GETDATE(), 'ET');
Run Code Online (Sandbox Code Playgroud)
错误信息是:
消息 9820,16 级,状态 1,第 27 行
提供给 AT TIME ZONE 子句的时区参数“ET”无效。
我不明白为什么我在这里收到错误。该代码永远不应该执行。简单地运行没有函数的代码SELECT
也不会引发任何错误。
为什么该查询失败?这可能是 SQL Server 中的错误吗?
FWIW,这种形式的函数可以工作:
CREATE OR ALTER FUNCTION [dbo].[TVF_BUG_REPRO_2] (@O DateTime, @Z varchar(50))
RETURNS TABLE
WITH SCHEMABINDING
AS
RETURN
SELECT
CAST(@O at time zone SZ.Zone at time zone 'Pacific Standard Time' AS DATETIME ) ConvertedDate
FROM (SELECT CASE @Z WHEN 'ET' THEN 'Eastern Standard Time' ELSE @Z END Zone) SZ;
Run Code Online (Sandbox Code Playgroud)