【问题标题】:Multiple CTE Queries, assign single column value to local variable多个 CTE 查询,将单列值分配给局部变量
【发布时间】:2019-02-13 16:54:33
【问题描述】:

这是我的 sql 查询。如何将 Count_CTE.TotalRecords 结果分配给我的本地分配变量?有人请吗???

DECLARE  @Totalrecords Bigint =0;

;WITH Main_Query_CTE AS(

SELECT 
U.Id,
U.Username,
P.Id as ProfileId,
P.Firstname,
P.Lastname 
FROM   [Dbo].[User] U
INNER JOIN [Profile] P
ON U.Id = P.Userid 
WHERE  AND U.[Status] <>0

),
Count_CTE AS ( SELECT COUNT(*) as TotalRecords FROM Main_Query_CTE )

SELECT * FROM Main_Query_CTE ,Count_CTE
ORDER BY Main_Query_CTE.Id
OFFSET 0 ROWS
FETCH NEXT 20 ROWS ONLY

【问题讨论】:

  • 。 . SQL Server 不提供在同一SELECT 语句中同时返回结果和分配给变量的功能。您的问题不清楚。
  • 感谢 Gordon 的及时回复。除了我的查询结果之外,我还想用记录总数设置输出参数。但不幸的是,SQL Server 没有提供任何方法可以将单列值分配给本地声明的变量。我正在寻找不使用#temp 表来实现这一目标的方法。

标签: sql sql-server-2012 common-table-expression


【解决方案1】:

正如 Gordan 所说,您不能在同一选择语句中分配变量并返回选择。如果您需要分配一个局部变量,最好的选择是将数据放入临时表中,然后进行选择。不过,您的问题有点不清楚 - 不确定您选择的最终目标是什么。

DECLARE  @Totalrecords Bigint =0;

SELECT 
U.Id,
U.Username,
P.Id as ProfileId,
P.Firstname,
P.Lastname 
into #temp
FROM   [Dbo].[User] U
INNER JOIN [Profile] P
ON U.Id = P.Userid 
WHERE  AND U.[Status] <> 0  

select @Totalrecords = COALESCE(COUNT(*),0) FROM #temp;

SELECT *
FROM #temp
ORDER BY id
OFFSET 0 ROWS
FETCH NEXT 20 ROWS ONLY

【讨论】:

  • 纠正我如果我错了 #temp 表在性能方面非常昂贵。我希望在不使用 #temp 表的情况下实现这一目标。
  • @SaadAbbasi 。 . .它增加了一些开销,但我不会称其为“非常昂贵”,尤其是对于您想做的事情。
  • @SaadAbbasi - 正如 Gordon 所说,它的开销很小,但没有其他方法可以设置局部变量并同时进行选择。您唯一的其他选择是两次从表中选择,临时表方法应该更快。如果预计数据集很小,我可以说您可以使用表变量来代替,它可能比临时表快一点,但同样的逻辑适用。
【解决方案2】:

抱歉,我参加这个聚会迟到了(希望我在 2019 年停下来),但为什么不在一个查询而不是两个单独的查询中返回结果呢?

WITH cte AS(
SELECT 
    U.Id,
    U.Username,
    P.Id as ProfileId,
    P.Firstname,
    P.Lastname,
    COUNT(*) OVER(PARTITION BY NULL) AS TotalRecords
FROM [Dbo].[User] U
INNER JOIN [Profile] P ON U.Id = P.Userid 
WHERE U.[Status] <> 0

)

SELECT * FROM cte
ORDER BY Id
OFFSET 0 ROWS
FETCH NEXT 20 ROWS ONLY

【讨论】:

  • 最终这可能会奏效,但显然更大的问题是如何在返回结果的同时将值保存到变量中。
  • @shawnt00 分页时不能。如果分页不是最大的问题,我会使用 @@rowcount 分配给您的变量。但是,我认为对 cte 与临时表与表变量的性能存在误解。我相信 cte 不是他最好的选择,我会更有兴趣了解更多关于 OP 的场景。对结果的真实期望(期望存储多少用户)或者如果这是为了其他代码检索(我认为是这种情况)。如果是后者,则无需在服务器端存储任何内容或通过SQL进行分页。
猜你喜欢
  • 2021-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-17
  • 2019-03-20
  • 2011-04-21
相关资源
最近更新 更多