【问题标题】:How to retrieve values from TempTable and set that values in local variables如何从 TempTable 中检索值并在局部变量中设置该值
【发布时间】:2018-01-25 13:41:51
【问题描述】:

我有这个代码:

  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
   '

我需要检索所有这些值。

请注意,我不知道临时表会返回多少行,并且说只声明第二个变量是行不通的。这样做的重点是最终将这些变量作为输入参数传递给函数。

【问题讨论】:

  • 如果您需要表中的所有值,为什么要将表变量重新分配给另一个变量?此外,这不是临时表。那是在 SQL 中具有不同属性和规则的不同对象。不要混淆它们。
  • 你需要这些值来做什么?
  • SELECT Amount FROM @GetTotalPaymentAmount 为您获取多个货币总和,如果您想要特定货币添加 where 子句以将其过滤到 1 行,否则如果您想处理每一行,则必须遍历它们一次。
  • 您很可能不需要需要循环播放。如果你解释你想用这些值做什么,我几乎可以保证你可以通过基于集合的操作来做到这一点。
  • @So_oP 。 . .您拥有表中的所有值。只需使用@GetTotalPaymentAmount

标签: sql sql-server tsql rdbms


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    @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
    

    【讨论】:

      猜你喜欢
      • 2012-07-08
      • 2013-05-20
      • 1970-01-01
      • 2022-01-12
      • 2016-05-19
      • 1970-01-01
      • 1970-01-01
      • 2017-04-14
      • 1970-01-01
      相关资源
      最近更新 更多