从表函数获取数据时出现问题

时间:2019-07-17 11:04:47

标签: sql-server

我希望我的函数返回一个带有一些值的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

当我执行此代码时

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êtearetourné   plusieurs valeurs。 Cela n'est pasautoriséquand lasous-requête西装   =,!=,<,<=,>,> =非常有效的表达方式。指令a.éréarrêtée。

英语翻译:

  

消息512,级别16,状态1,第4行子查询返回多个   价值观。当子查询后跟= ,!时,不允许这样做。 =,<,<=,>,>   =或用作表达式时。该指令已停止。

1 个答案:

答案 0 :(得分:0)

您的CLOSING_PRICE在更新语句中很可能给出多条记录,请在查询中尝试top 1

尝试一下:

    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 top 1  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