为什么此 TVF 使用 GETDATE() 作为输入参数时会抛出错误 9820?

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 中的错误吗?

Dav*_*oft 5

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)