如何在SQL Server 2012的选择查询中将值设置为变量?

如何在SQL Server 2012的选择查询中将值设置为变量?,sql,variables,sql-server-2012,setvalue,Sql,Variables,Sql Server 2012,Setvalue,我想为一个复杂的查询生成一个序列。为此,我使用了一个变量@rowNo 我的逻辑是: 如果字段-isremoved=0,则将行号增加1。 如果isremoved=1,则只将行数增加1一次,直到找到下一个0 这是到目前为止我所做的,但它给了我语法错误 DECLARE @rowNo INT; SET @rowNo = -1; SELECT case when sampleTable.isremoved = 0 then @rowNo + 1 else @rowNo end as rowNum

我想为一个复杂的查询生成一个序列。为此,我使用了一个变量@rowNo

我的逻辑是: 如果字段-isremoved=0,则将行号增加1。 如果isremoved=1,则只将行数增加1一次,直到找到下一个0

这是到目前为止我所做的,但它给了我语法错误

DECLARE @rowNo INT;
SET @rowNo = -1;

SELECT
case when sampleTable.isremoved = 0 then @rowNo + 1
    else @rowNo end
as rowNumber,
X,
Y,
Z
.
.
FROM tbl_sample sampleTable
INNER JOIN tbl_sample_2 sample2 ON sampleTable.id = sample2.id
.
.
.
这是我的愿望输出:-

那么,在sql server 2012中实现此类功能的正确方法是什么

编辑:- 我有一个解决方案,可以使用子查询来检索行号。但这将影响性能,因为这是一个非常复杂的查询,需要20多个连接和大量数据。
因此,请给我推荐一种替代方法。

一种方法是使用子查询:

Select (Select count(*) from tbl_sample
        where id <= a.id 
            and a.isRemoved =1) rowNumber,
   X, Y, Z
From tbl_sample a
     Join tbl_sample_2 b 
         On b.id = a.id

在SQL Server 2012+中,您可以使用累积总和执行任何操作:

SELECT sum(case when sampleTable.isremoved = 0 then 1 else 0 end) over
            (order by . . .)
       . . .
order by应在外部查询中重复order by。您也可以通过选择null来尝试使用order。根据我的经验,这在外部查询中使用了数据的排序,但这并没有文档记录始终有效

SQL Server不允许您在选择中设置变量并在结果集中返回值。一个或另一个,但不是两个。

我假设您的行数逻辑等价于:如果previous isremoved=0,则将行数增加1,否则保持原样

使用滞后和求和的组合。。。通过这种方式,您可以轻松实现以下逻辑:

SELECT id, isremoved,
       SUM(IIF(prevFlag = 0, 1, 0)) OVER (ORDER BY id) AS rowNumber
FROM (
SELECT a.id, isremoved,
       COALESCE(LAG(isremoved) OVER (ORDER BY a.id), isremoved) AS prevFlag
FROM tbl_sample AS a
INNER JOIN tbl_sample_2 AS b ON b.id = a.id) AS t

看一看这个:是的,这是正确的。我为混淆道歉。我已经更新了问题。这张图片完美地代表了我的结果,以防你们仍然感到困惑。这是一个非常复杂的查询,几乎有20个连接。因此,这种解决方案会影响性能。是的,它会,但是,假设其中一个id列是外键,如果在其上放置索引,则会将性能影响降至最低。您的解决方案适合POC。但它不适用于我的实际查询。我很快会带着确切的问题回来。这是正确的解决方案。但有一个问题,我使用的是order by。这会改变行号。此处演示-@未知我不确定我是否了解您的实际需求。如果您的行是按seq而不是id排序的,那么在窗口函数的OVER子句中使用此字段而不是id。我只想在结果上应用“orderby”。不要与名称seq混淆。让我们假设有一个名称字段,我试图根据它排序。同样的情况也会发生。@unknown这是不可能的。这就像想同时以两种不同的方式对单个字段进行排序。