小编典典

返回带有Null的表时出现问题

sql

我想让我的函数返回一个带有一些值的A表

我必须在更新中修复某些问题,但我不知道下面是什么函数FngetTableH

ALTER FUNCTION [dbo].[FnGetTableH] 
 (
  @Date DateTime 
  )
  RETURNS  @Listeab_ Table(CLOSING_PRICE money,IdValeur int)
 AS
  BEGIN

    Insert @Listeab_
   (          CLOSING_PRICE ,IdValeur)

     select Distinct 0 , IdValeur
     From Historique



     Update @Listeab_
       Set CLOSING_PRICE = (Select  CLOSING_PRICE
       from Historique H
      inner join (Select MAX(@Date) As DATEDU,IdValeur FROM Historique
  where 
     DATE_NEGO<= @Date 
       group by IdValeur ) L2
       on 
  H.DATE_NEGO=L2.DATEDU
     and
  H.IdValeur=L2.IdValeur
       )
  return 
 END

when i Execute this code

declare @Date date = '10/09/2013'

---select*from FnGetTableH(@Date)
select  C.IdClient,H.IdValeur,C.RaisonSocial,SUM( case I.sens 
                                                   WHEN 'c' then  + I.Qantite
                                                   WHEN'd' then  - I.Qantite
                                                  END) as 'Solde', H.closing_price
from Imputations I
Inner join FnGetTableH(@Date) H
on H.IdValeur=I.IdValeur 
Inner join Clients C
on C.IdClient=I.IdClient
where I.DateImputation=@Date    
group by C.IdClient,RaisonSocial,H.closing_price,H.IdValeur
Order by IdClient asc

Msg 512,Niveau 16,État1,Ligne 4 Lasous-requêteretournéplusieurs valeurs。最适合自己的表达方式=,!=,<,<=,>,> = ou estutilisétantqu’expression。指令aéréarrêtée。


阅读 149

收藏
2021-04-15

共1个答案

小编典典

在您最里面的查询中,我认为MAX(@Date)应该是MAX(DATE_NEGO),这可能解释了为什么收盘价查询返回多个结果。

仍然有可能出现多个结果,因此您可能需要考虑这一点。如果这无关紧要,则可以选择max(closing_price),尽管我怀疑这可能会发生,在这种情况下,您需要进行一些排序才能选择正确使用的价格。

编辑:试试这个:

ALTER FUNCTION [dbo].[FnGetTableH]
(
    @Date DATETIME
)
RETURNS @Listeab_ TABLE
(
    CLOSING_PRICE MONEY,
    IdValeur INT
)
AS
BEGIN
    WITH prices AS
    (
        SELECT IdValeur,
            CLOSING_PRICE,
            ROW_NUMBER() OVER (PARTITION BY IdValuer ORDER BY DATE_NEGO DESC) rn
        FROM Historique
        WHERE DATE_NEGO <= @Date
    )
    INSERT @Listeab_(CLOSING_PRICE, IdValeur)
    SELECT DISTINCT ISNULL(p.CLOSING_PRICE, 0),
        h.IdValeur
    FROM Historique h
    LEFT OUTER JOIN prices p ON h.IdValeur = p.IdValeur
        AND p.rn = 1
        RETURN;
END;
2021-04-15