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

7

我正在尝试创建一个带有游标的函数。我想从游标中获取“数量”值并将其放入临时表中。但是我还没有成功地获取该值并将其放入临时表中。

我在无法完成的地方添加了注释...

以下是我的代码:

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

5
你可以使用INSERT INTO @Temp (Quantity) VALUES (@Amount),但这个函数的性能会非常糟糕。实际上,这似乎是一个X-Y问题。你可能需要描述一下你尝试通过这个函数实现什么目标,然后得到解决方案,而不是寻找如何绕过解决方案中的问题。 - GarethD
4
你为什么要使用游标来加载临时表? - Andrew
你可以使用 SELECT INTO...,它会为你创建表格,或者声明一个表格并使用 INSERT INTO...SELECT 语句。 - Andrew
4
虽然我认为在这里光标并不是一个合适的解决方案,但你也应该养成根据需要声明适当的光标的习惯,例如,如果你只从光标中读取数据,则应使用“READ_ONLY”,如果你只使用FETCH NEXT,则应使用“FORWARD_ONLY”等。这可以避免冗余内存使用,并显著提高光标的性能。 - GarethD
顺便提一下,如果您使用SELECT TOP 1查询构建游标,则游标仅运行一次(对于查询返回的一行),然后结束。始终如此。 - Tab Alleman
这个函数应该做什么?你不仅有一个光标,而且它在一个标量函数内部。我猜这可以转换成一个内联表值函数。这将大大提高性能。 - Sean Lange
3个回答

10
你可以执行以下步骤。请注意,它仅插入数量,因此如果您打算包括价格,则需要进行修改。
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')

是的,我需要添加价格,但我不确定如何更新它。有什么想法吗? - Arif YILMAZ
2
你怎么得到价格的?它是来自同一个 SELECT 语句吗? - SQLChao
从LG_XT002001_001 XT002中选择ORG_PRICE, WHERE XT002.ORF_GUID='EEB44E72-3717-4F5B-8F7E-6A36EB38EA22', 按照ORFLINE_NO升序排序。 - Arif YILMAZ
如果可能的话,我会重写查询以在一个select中获取2列。然后你可以从我的查询中删除(quantity)或将其更改为(quantity, price) - SQLChao

5
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

1

编辑:这应该有助于处理价格。由于价格来自不同的 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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接