如何从 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 调用这两个函数?