【问题标题】:Cannot reference a variable in a Common Table Expression无法在公用表表达式中引用变量
【发布时间】: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


【解决方案1】:

@Andrew 发现了问题。 DBeaver 没有解释所有的 SQL。虽然DBeaver documentation中没有讨论,全选-> control-Enter可以在DBeaver中执行这个最小的例子。

【讨论】:

    猜你喜欢
    • 2012-10-22
    • 2022-07-04
    • 2015-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    相关资源
    最近更新 更多