【问题标题】:Using a scalar variable inside a CTE在 CTE 中使用标量变量
【发布时间】:2020-12-19 00:06:50
【问题描述】:

我正在审查别人的代码,但我碰壁了。当我尝试执行提供的脚本时,出现以下错误:

必须声明标量变量“@userId”。

我试图删除第 2 行的分号只是为了尝试,但这给了我以下错误:

关键字“with”附近的语法不正确。如果这个语句是一个公用表表达式、一个 xmlnamespaces 子句或一个更改跟踪上下文子句,则前面的语句必须以分号结束。

我对此感到非常困惑,因为这段确切的代码可以在其他机器上运行,但不能在我的机器上运行。我知道还有其他方法可以编写此查询,但我需要让它工作。 有什么方法可以让变量按此脚本中的预期工作而不重写整个内容?

我在 Ubuntu 18.04.4 LTS 上使用 Microsoft SQL Server 2019 (RTM-CU8) (KB4577194) - 15.0.4073.23 (X64)

DECLARE @userId int
SET @userId =:user_id;
                        
WITH bidsplacedtotal AS (
    SELECT amount, user_id, auction_id
    FROM bids WHERE user_id = @userId
)
,bidsreceivedtotal AS (
    SELECT amount, user_id, auction_id
    FROM bids WHERE auction_id IN
    (SELECT id FROM auctions WHERE user_id = @userId)
)
          
SELECT COUNT(amount) FROM bidsplacedtotal) AS placed_total

UNION

SELECT COUNT(amount) FROM bidsreceivedtotal) AS received_total

【问题讨论】:

  • :user_id 是什么?
  • 当您将该代码中的 :user_id 替换为文字数字 (2091) 时会发生什么:代码是否运行?
  • 无法重现此行为:dbfiddle.uk/…
  • 您使用什么工具发送查询?是否使用分号作为批处理分隔符?
  • @StefanTeunissen 最好标记有问题的工具并专门提及它以供将来搜索的其他人使用。上下文很重要!

标签: sql sql-server odbc dbeaver sql-server-2019


【解决方案1】:

试试这个代码看看它是否有效:

DECLARE @userId int
   SELECT @userId = 2091
                        
;WITH bidsplacedtotal AS (
    SELECT amount, user_id, auction_id
    FROM bids WHERE user_id = @userId
)
,bidsreceivedtotal AS (
    SELECT amount, user_id, auction_id
    FROM bids WHERE auction_id IN
    (SELECT id FROM auctions WHERE user_id = @userId)
)
          
SELECT COUNT(amount) as CountAmount FROM bidsplacedtotal) AS placed_total

UNION

SELECT COUNT(amount) as CountAmount FROM bidsreceivedtotal) AS received_total

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-26
    • 1970-01-01
    • 2021-06-09
    相关资源
    最近更新 更多