在 Sql Server 中,如何将游标中的值放入临时表中?

Posted

技术标签:

【中文标题】在 Sql Server 中,如何将游标中的值放入临时表中?【英文标题】:In Sql Server, how do you put value from cursor into temp table? 【发布时间】:2014-07-23 15:54:26 【问题描述】:

我正在尝试创建一个包含光标的函数。我想从该游标中获取 Quantity 值并将其放入临时表中。但是我还没有成功获取到值并将其放入临时表中。

我在无法完成的地方发表评论...

这是我的代码

alter FUNCTION test(@input VARCHAR(250)) RETURNS Decimal(8, 2) AS BEGIN

DECLARE @rst Decimal(8, 2) SET @rst=0
DECLARE @Temp TABLE (Quantity Decimal(8,2), Price Decimal(8,2))
DECLARE @amount Decimal(8,2)
DECLARE @price Decimal(8,2)

DECLARE CrsOrfLine CURSOR FOR
SELECT AMOUNT FROM LG_001_01_ORFLINE 
 WHERE LINETYPE    = 0 
 AND ORDFICHEREF = (SELECT TOP 1 LOGICALREF FROM LG_001_01_ORFICHE WHERE GUID='EEB44E72-3717-4F5B-8F7E-6A36EB38EA22')
 ORDER BY LINENO_ ASC;

FETCH NEXT FROM CrsOrfLine INTO  @amount
WHILE (@@FETCH_STATUS = 0) 
BEGIN
     INSERT INTO @Temp (Quantity)

     /* HOW AM I SUPPOSED TO ADD IT INTO THE TEMP?????? */
     /* I COULDNT FIGURE THIS PART OUT                  */

FETCH NEXT FROM CrsOrfLine INTO @amount
END /*WHILE*/
CLOSE CrsOrfLine
DEALLOCATE CrsOrfLine

【问题讨论】:

你会使用INSERT INTO @Temp (Quantity) VALUES (@Amount) - 但是几乎肯定有更好的方法,这个函数的性能会很糟糕!好像an XY Problem。您可能想描述您试图通过您的功能实现的目标并获得答案,而不是如何解决解决方案中的问题。 你到底为什么要使用游标来加载临时表? 你可以SELECT INTO...,它会为你创建表,或者声明它和INSERT INTO...SELECT 虽然我不认为游标在这里是一个合适的解决方案,但你也应该养成为你的需要声明一个合适的游标的习惯,即如果你只是从游标读取使用@987654326 @,如果你只使用过FETCH NEXT,则使用FORWARD_ONLY等。这样可以避免多余的内存使用,并且可以显着提高游标的性能。 顺便说一句,如果您使用 SELECT TOP 1 查询构建游标,您的游标将只运行一次(对于查询返回的一行)然后结束。总是。 【参考方案1】:

您可以执行以下操作。请注意,它只插入数量,因此如果您打算包含价格,则需要对其进行修改。

DECLARE @Temp TABLE 
(
  Quantity Decimal(8,2), 
  Price Decimal(8,2)
)


INSERT INTO @temp (Quantity)
SELECT AMOUNT FROM LG_001_01_ORFLINE 
WHERE LINETYPE = 0 
AND ORDFICHEREF = (SELECT TOP 1 LOGICALREF FROM LG_001_01_ORFICHE WHERE GUID='EEB44E72-3717-4F5B-8F7E-6A36EB38EA22 ORDER BY LINENO_ ASC')

【讨论】:

是的,我也需要添加价格,但我不知道如何更新它。有什么想法吗? 您如何获得价格?是否来自同一个SELECT SELECT ORG_PRICE FROM LG_XT002001_001 XT002 WHERE XT002.ORF_GUID='EEB44E72-3717-4F5B-8F7E-6A36EB38EA22' ORFLINE_NO ASC 订单; 如果可能的话,我会重写查询以在一次选择中获取 2 列。然后,您可以从我的查询中删除 (quantity) 或将其更改为 (quantity, price)【参考方案2】:
CREATE PROCEDURE [dbo].[usp_demo_cursor_with_temp_table]              
AS              
BEGIN  
DECLARE @temp TABLE  (value1 varchar(5),value2 varchar(5),value3 INT,value4 varchar(1))

DECLARE @value1 varchar(5)
DECLARE @value2 varchar(5) 
DECLARE @value3 INT
DECLARE @value4 varchar(5)

DECLARE check_data_cursor CURSOR FOR 

select distinct value1,value2,value3,value4 from table_name where status = 'A'

OPEN check_data_cursor

FETCH NEXT FROM check_data_cursor INTO @value1,@value2,@value3,@value4

WHILE (@@FETCH_STATUS <> -1)

BEGIN
-- any business logic + temp inseration 

insert into @temp values (@tickerCode,@quarter,@financial_year,@status)
 END 

 FETCH NEXT FROM check_data_cursor  INTO @value1,@value2,@value3,@value4
 END

 CLOSE check_data_cursor

 DEALLOCATE check_data_cursor

 -- to view temp data

 select * from @temp          

END

【讨论】:

【参考方案3】:

已编辑:这应该有助于控制价格。由于价格来自不同的Select 声明,您可能需要在此处使用join

INSERT INTO @Temp (Quantity, Price)
(SELECT AMOUNT FROM LG_001_01_ORFLINE 
WHERE LINETYPE    = 0 
AND ORDFICHEREF = (SELECT TOP 1 LOGICALREF FROM LG_001_01_ORFICHE WHERE GUID='EEB44E72-3717-4F5B-8F7E-6A36EB38EA22' ORDER BY LINENO_ ASC)) T1
JOIN 
(SELECT ORG_PRICE FROM LG_XT002001_001 XT002 WHERE XT002.ORF_GUID='EEB44E72-3717-4F5B-8F7E-6A36EB38EA22' ORDER BY ORFLINE_NO ASC) T2
ON T1.Primary_Key = T2.Primary_Key

【讨论】:

以上是关于在 Sql Server 中,如何将游标中的值放入临时表中?的主要内容,如果未能解决你的问题,请参考以下文章

在 SQL Server 游标中获取多个值

sql server游标

sql server数据库中如何用游标进行更新

sql server 游标 写给自己

sql server数据库中用游标进行更新

SQL Server利用游标将学生表中的成绩转化为绩点