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

Posted

技术标签:

【中文标题】如何从 TempTable 中检索值并在局部变量中设置该值【英文标题】:How to retrieve values from TempTable and set that values in local variables 【发布时间】: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 【参考方案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

【讨论】:

以上是关于如何从 TempTable 中检索值并在局部变量中设置该值的主要内容,如果未能解决你的问题,请参考以下文章

如何从 javascript 变量发送表单值并在 php 中作为整数接收? [复制]

如何从一个函数检索对象/变量的值到另一个函数并通过 main 调用这两个函数?

从查询中检索特定键值并在查询中获取它们对的计数

PHP 如何从 AJAX 调用中发布多个数组/json 值并在同一个 SQL 查询中运行它们?

如何在我的主要模式挂钩中访问目录局部变量?

在 case 语句中更新值并设置局部变量