如何从TempTable中检索值并在局部变量中设置该值

时间:2018-01-25 13:41:51

标签: sql sql-server tsql rdbms

我有这段代码:

  DECLARE @TotalPayment DECIMAL(18,4)

  DECLARE @GetTotalPaymentAmount AS TABLE 
                                    (
                                        Amount DECIMAL(18,4),
                                        CurrencyId CHAR(3)
                                    )

  INSERT INTO @GetTotalPaymentAmount
      SELECT SUM(Amount), CurrencyId
      FROM [dbo].[fn_DepositWithdrawReport]()
      WHERE OperationTypeId = 2
      GROUP BY CurrencyId

  SET @TotalPayment = (SELECT Amount FROM @GetTotalPaymentAmount)

我收到此错误

  

子查询返回的值超过1。

所以是的,我知道SET逻辑中的问题,因为@GetTotalPayment返回多行。如果我使用例如TOP 1,它工作得很好,但我需要该表的所有值。我怎样才能获得所有值并将它们分配给该表中的局部变量?

我正在接受这样的表格

A  'C 
---'---
10 'USD 
20 'EURO
   '

我需要检索所有这些值。

请注意,我不知道从临时表中返回多少行,并说只是声明第二个变量不起作用。这一点的最后一点是最终将这些变量作为输入参数传递。

2 个答案:

答案 0 :(得分:0)

在这里,我稍微修改了你的代码。应该工作:)

DECLARE @TotalPayment DECIMAL(18,4)

DECLARE @GetTotalPaymentAmount AS TABLE 
(
  Id int identity(1,1),--added Id column
  Amount DECIMAL(18,4),
  CurrencyId CHAR(3)
)

INSERT INTO @GetTotalPaymentAmount
SELECT SUM(Amount),CurrencyId
FROM [dbo].[fn_DepositWithdrawReport]()
WHERE OperationTypeId = 2
GROUP BY CurrencyId

declare @i int, @cnt int
set @i = 1
select @cnt = COUNT(*) from @GetTotalPaymentAmount

while @i <= @cnt
begin
    select @TotalPayment = Amount from @GetTotalPaymentAmount where Id = @i
    --do stuff with retrieved value
    @i += 1
end

答案 1 :(得分:0)

@So_Op

如果您希望数据在SCALAR函数中使用,那么只需执行此操作

SELECT
     G.Amount
    ,dbo.FN_ScalarFunction(G.Amount)
FROM
   @GetTotalPaymentAmount G

如果它是TABLE函数,则可以使用

SELECT
     G.Amount
    ,F.ReturnValue
FROM
   @GetTotalPaymentAmount G
CROSS APPLY
   dbo.FN_TableFunction(G.Amount) F