【发布时间】:2021-09-08 04:11:52
【问题描述】:
此查询因错误而失败
SQL 错误 [137] [S0002]:必须声明标量变量“@queryid”
代码:
-- create temp table
IF OBJECT_ID(N'tempdb..#TmpTable') IS NOT NULL
DROP TABLE #TmpTable
CREATE TABLE #TmpTable
(
[id] INT,
[QueryId] NVARCHAR(200)
);
INSERT INTO #TmpTable VALUES (1, 'hi')
INSERT INTO #TmpTable VALUES (3, 'low')
DECLARE @queryid NVARCHAR(50) = 'hi'
;WITH cte as
(
SELECT *
FROM #TmpTable
WHERE QueryId = @queryid
)
SELECT * FROM cte
但是用QueryId = 'hi' 替换QueryId = @queryid 会返回表格
1 hi
正如预期的那样。 CTE documentation 并不表示公用表表达式不能引用变量。我欢迎使 CTE 能够引用之前声明的变量的修复程序。
我在跑步
Microsoft SQL Server 2019 (RTM) - 15.0.2000.5 (X64)
Sep 24 2019 13:48:23
Enterprise Edition: Core-based Licensing (64-bit) on Windows Server 2019 Standard 10.0 <X64> (Build 17763: ) (Hypervisor),
并从 DBeaver Enterprise 版本 7.3.0.202012061950 访问它
【问题讨论】:
-
代码运行良好:dbfiddle.uk/….
-
@GordonLinoff 感谢您的尝试。正如您所说,它在您使用的 MSSQL 2019 实例中运行。这意味着我的环境的某些方面会导致错误。它可能是 DBeaver 或驱动程序。我会问他们。
-
你是否选择了所有的语句并使用 crtl + enter 执行它?
-
@Andrew 很好。不,我一直在点击“执行 SQL 脚本”,或者输入 option-X。 DBeaver 很棒,但在我看来,它执行 SQL 的规则非常违反直觉。
标签: sql-server tsql common-table-expression dbeaver