【发布时间】: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 查询构建游标,您的游标将只运行一次(对于查询返回的一行)然后结束。总是。
标签: sql sql-server temp-tables database-cursor