游标内的查询之间不返回所有SQL行

游标内的查询之间不返回所有SQL行,sql,sql-server,Sql,Sql Server,我编写了一个嵌套游标语句,用于: 1.循环遍历一个2列表格,并使用第一列作为范围开始,第二列作为范围结束 2.返回一个包含范围(包括)内的单独表格中所有值的一栏表格 我的问题是表中没有包括范围结束值 @范围表: range1 range2 -------------------- A03 A069 A20 A20 A202 A202 A25 A25 A250 A2509 A251 A251 A2511 A2513 A254 A2549 A263 A2651

我编写了一个嵌套游标语句,用于: 1.循环遍历一个2列表格,并使用第一列作为范围开始,第二列作为范围结束 2.返回一个包含范围(包括)内的单独表格中所有值的一栏表格

我的问题是表中没有包括范围结束值

@范围表:

range1 range2
--------------------
A03    A069
A20    A20
A202   A202
A25    A25
A250   A2509
A251   A251
A2511  A2513
A254   A2549
A263   A2651
------------------
下面是创建包含所有值范围内的所有产品ID的表的代码。这些值采用varchar格式。当我使用查询原始表[dbo].[products]时,即。 A03和A069之间的

甚至是一个值范围,例如
介于“A25”和“A25”之间
我得到了我需要的一切

Select DISTINCT * into #temp From @RangeTable

DECLARE @prodID varchar(20);
DECLARE @rangestart varchar(20);
DECLARE @rangeend varchar(20);
DECLARE @prods TABLE (ID VARCHAR(32));

DECLARE ranges CURSOR FOR
SELECT RangeFrom, RangeTo FROM #temp

OPEN ranges

FETCH NEXT FROM ranges
INTO @rangestart, @rangeend

WHILE @@FETCH_STATUS = 0
BEGIN
    DECLARE id CURSOR FOR 
    SELECT c.ID
    FROM dbo.products as c
    WHERE rtrim(ltrim(c.ID)) BETWEEN rtrim(ltrim(@rangestart)) AND rtrim(ltrim(@rangeend))
    ORDER BY c.ID;

    OPEN id
    FETCH NEXT FROM id INTO @prodID

    WHILE @@FETCH_STATUS = 0
    BEGIN
        INSERT INTO @prods VALUES(@prodID)
        FETCH NEXT FROM id INTO @prodID
    END

    CLOSE id;
    DEALLOCATE id;
    FETCH NEXT FROM ranges INTO @rangestart, @rangeend
END

CLOSE ranges;
DEALLOCATE ranges;
SELECT * FROM @prods
TRUNCATE TABLE #temp
DROP TABLE #temp
它不包括范围2中的值,对于一个值范围(即“A20”到“A20”),它将完全跳过该范围

我尝试过用其他方式使用FETCH,例如将光标设置为SCROLL并使用FETCH LAST,但即使这样,也会返回范围内从第二位到最后一位的值

起初我认为这可能是一个后续空白的问题,这就是为什么我把rtrim和ltrim放在一起。 调试时,我可以看到@@FETCH\u状态在范围内倒数第二个值之后更改为-1


提前感谢您提供的任何想法、提示或建议。

您必须拥有所有这些吗

WHERE rtrim(ltrim(c.ID)) BETWEEN rtrim(ltrim(@rangestart)) AND rtrim(ltrim(@rangeend))
为什么不呢

WHERE c.ID BETWEEN @rangestart AND @rangeend
你有没有试过:

WHERE c.ID >= @rangestart AND c.ID <= @rangeend

其中c.ID>=@rangestart和c.ID您必须拥有所有这些吗

WHERE rtrim(ltrim(c.ID)) BETWEEN rtrim(ltrim(@rangestart)) AND rtrim(ltrim(@rangeend))
为什么不呢

WHERE c.ID BETWEEN @rangestart AND @rangeend
你有没有试过:

WHERE c.ID >= @rangestart AND c.ID <= @rangeend

其中c.ID>=@rangestart和c.ID您必须拥有所有这些吗

WHERE rtrim(ltrim(c.ID)) BETWEEN rtrim(ltrim(@rangestart)) AND rtrim(ltrim(@rangeend))
为什么不呢

WHERE c.ID BETWEEN @rangestart AND @rangeend
你有没有试过:

WHERE c.ID >= @rangestart AND c.ID <= @rangeend

其中c.ID>=@rangestart和c.ID您必须拥有所有这些吗

WHERE rtrim(ltrim(c.ID)) BETWEEN rtrim(ltrim(@rangestart)) AND rtrim(ltrim(@rangeend))
为什么不呢

WHERE c.ID BETWEEN @rangestart AND @rangeend
你有没有试过:

WHERE c.ID >= @rangestart AND c.ID <= @rangeend

其中c.ID>=@rangestart和c.ID为什么要使用光标?SQL在处理集合时运行最有效。因为你没有为每一行做任何特别的事情。因此,set处理似乎更有效。当您必须单独处理每条记录时,最好使用游标。例如,您不知道数据是否具有足够的质量,必须将出错的记录写入单独的文件进行处理。(甚至可以通过使用多个基于集合的查询来实现…)

例如:

在本例中,我只是基于a范围之间的数据进行连接,然后将产品id插入一个新表“B”


注意:在我的示例中,A250和A2509不包括A251,为什么要使用光标?SQL在处理集合时运行最有效。因为你没有为每一行做任何特别的事情。因此,set处理似乎更有效。当您必须单独处理每条记录时,最好使用游标。例如,您不知道数据是否具有足够的质量,必须将出错的记录写入单独的文件进行处理。(甚至可以通过使用多个基于集合的查询来实现…)

例如:

在本例中,我只是基于a范围之间的数据进行连接,然后将产品id插入一个新表“B”


注意:在我的示例中,A250和A2509不包括A251,为什么要使用光标?SQL在处理集合时运行最有效。因为你没有为每一行做任何特别的事情。因此,set处理似乎更有效。当您必须单独处理每条记录时,最好使用游标。例如,您不知道数据是否具有足够的质量,必须将出错的记录写入单独的文件进行处理。(甚至可以通过使用多个基于集合的查询来实现…)

例如:

在本例中,我只是基于a范围之间的数据进行连接,然后将产品id插入一个新表“B”


注意:在我的示例中,A250和A2509不包括A251,为什么要使用光标?SQL在处理集合时运行最有效。因为你没有为每一行做任何特别的事情。因此,set处理似乎更有效。当您必须单独处理每条记录时,最好使用游标。例如,您不知道数据是否具有足够的质量,必须将出错的记录写入单独的文件进行处理。(甚至可以通过使用多个基于集合的查询来实现…)

例如:

在本例中,我只是基于a范围之间的数据进行连接,然后将产品id插入一个新表“B”


注:在我的示例中,A250和A2509将不包括A251

我假设产品包含定义范围内的产品的完整列表是否正确?@xQbert是的,它包含完整列表。您究竟为什么使用光标在…中插入
。。。。选择…
query??这完全没有必要,也毫无意义。。。。游标是邪恶的,它们是RBAR(一行接一行)处理,在SQL Server中非常不受欢迎……我假设产品包含在定义范围内找到的产品的完整列表,对吗?@xQbert是的,它确实包含一个完整的列表。你到底为什么要使用游标在……中进行
插入。。。。选择…
query??这完全没有必要,也毫无意义。。。。游标是邪恶的,它们是RBAR(一行接一行)处理,在SQL Server中非常不受欢迎……我假设产品包含在定义范围内找到的产品的完整列表,对吗?@xQbert是的,它确实包含一个完整的列表。你到底为什么要使用游标在……中进行
插入。。。。选择…
query??这完全没有必要,也毫无意义。。。。游标是邪恶的,它们是RBAR(一行接一行)处理,在SQL Server中非常不受欢迎……我假设产品包含在定义的范围内找到的产品的完整列表,对吗?@xQbert是的,它确实包含一个完整的列表为什么