游标内的查询之间不返回所有SQL行
我编写了一个嵌套游标语句,用于: 1.循环遍历一个2列表格,并使用第一列作为范围开始,第二列作为范围结束 2.返回一个包含范围(包括)内的单独表格中所有值的一栏表格 我的问题是表中没有包括范围结束值 @范围表:游标内的查询之间不返回所有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
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是的,它确实包含一个完整的列表为什么