2015-04-23 85 views
1

我有一個函數返回一組itemcodes。其結果是正確的,但是當我把它在存儲過程中不顯示任何東西:SQL SERVER CAL函數在IN語句中

declare @itemgroupCode int 
set  @itemgroupCode=118 
declare @todate datetime 
set  @todate='15.april.15' 

declare @Group nvarchar(Max) 
set  @Group=(SELECT [dbo].[CurrProduction] (118,'15.APRIL.2015')) 
select @Group 

SELECT * 
FROM (
SELECT 
o.ItemCode as [Item],tm.ItemName as Dscription,o.Warehouse as Wr,obtn.LotNumber, 
itl1.quantity as qty ,tm.U_Reusb,@Group as Grp 

from OINM o inner join OITL on OITL.DocType = o .TransType and OITL.DocNum = o.BASE_REF and OITL.DocLine= o .DocLineNum and OITL .LocCode = o.Warehouse and o .ItemCode = OITL.ItemCode 
inner join ITL1 on ITL1.LogEntry = OITL.LogEntry and ITL1.ItemCode=OITL.ItemCode 
inner join OITM tm on tm.ItemCode = ITL1.ItemCode 
inner join OITB on tm .ItmsGrpCod = OITB .ItmsGrpCod 
INNER JOIN OWHS AS OH ON o.Warehouse=OH.WhsCode 
inner join OBTN on OBTN.SysNumber = ITL1.SysNumber and OBTN.ItemCode = ITL1.ItemCode and tm.ManBtchNum = 'Y' 
WHERE --tm.ItmsGrpCod=108 and 
    tm.ItemCode in (@Group) 
and o.DocDate<[email protected]) as s 
PIVOT 
(
SUM(qty) 
FOR Wr IN (
[DIS],[G&I],[GD-001],[GD-002],[GD-003],[GD-004], 
[GD-005],[GD-006],[GD-007],[GD-008],[GD-009],[GD-010], 
[GD-011],[GD-012],[GD-013],[GD-014],[GD-015],[GD-016],[GD-017],[GD-018], 
[GD-019],[GD-020],[GD-021],[GD-022],[GD-023],[GD-024],[GD-025],[GD-026], 
[GD-027],[GD-028],[GD-029],[GD-030],[GD-031],[GD-032],[GD-033],[GD-034],[GD-035], 
[KHI AB],[KHI MM],[Loan],[LUB],[Main],[PCG - M1],[PCG - M2], 
[PHS],[PMG],[PRO],[REJ],[REP],[REP-V],[Selling],[SKP] 
) 
)AS PVT 

在函數返回時,我在IN CLAUSE粘貼以下它給了我正確的結果,但是當我傳遞的結果函數調用,它不會顯示任何東西

函數返回:

'FYCT-00063','FYCM-00016','FYCM-00064','FYCF-00018','FYCM-00021','FYOG-00016','FYCM-00004','FYCM-00031','FYCM-00042' function code is following. 

** 

ALTER FUNCTION [dbo].[CurrProduction] 
(
@unit varchar(10), @date datetime 
) 
RETURNS Varchar(Max) 
AS 
BEGIN 
    -- Declare the return variable here 
    DECLARE @ResultVar varchar(Max) 
    SELECT DISTINCT @ResultVar='''' + REPLACE(STUFF((
    SELECT ',',+CAST(OWOR.ItemCode AS VARCHAR(10)) [text()] 
    FROM OWOR 
    where [email protected] AND OWOR.U_Unit=CASE 
           when @unit=108 then 'Unit No1' 
           when @unit=118 then 'Unit No 2' 
           when @unit=119 then 'Unit No 3' END 
    AND OWOR.Status!='C' 
    FOR XML PATH('') , TYPE) 
    .value('.','NVARCHAR(MAX)'),1,1,' '),',',''',''')+''''      

    -- Return the result of the function 
    RETURN @RESULTVAR 
END 

**

+0

什麼是函數的類型?這個函數返回什麼? –

+0

@GiorgiNakeuri這是未定義的函數,它返回varchar –

+0

它應該是內聯表值函數並返回結果集,那麼你可以像'where where itemcode in(select * from [dbo]。[CurrProduction](118,'15 .APRIL .2015')))' –

回答

0

爲了做到你想要什麼第e函數應該是Inline Table Valued函數。然後你可以簡單地在IN中調用它。例如:

CREATE TABLE ttinline(id int) 
GO 

INSERT INTO dbo.ttinline 
VALUES (1),(2),(3) 

CREATE FUNCTION fnInline() 
RETURNS TABLE 
AS 
return SELECT * FROM dbo.ttinline 
GO 

SELECT * FROM dbo.ttinline WHERE id IN(SELECT * FROM dbo.fnInline())   

輸出:

id 
1 
2 
3 

編輯:

ALTER FUNCTION [dbo].[CurrProduction] 
(
@unit varchar(10), @date datetime 
) 
RETURNS TABLE 
AS 
    RETURN 
    SELECT DISTINCT CAST(OWOR.ItemCode AS VARCHAR(10)) AS CODE 
    FROM OWOR 
    where [email protected] AND OWOR.U_Unit=CASE 
           when @unit=108 then 'Unit No1' 
           when @unit=118 then 'Unit No 2' 
           when @unit=119 then 'Unit No 3' END 
    AND OWOR.Status!='C' 
GO 


DECLARE @itemgroupCode INT 
SET @itemgroupCode = 118 
DECLARE @todate DATETIME 
SET @todate = '15.april.15' 

SELECT * 
FROM (SELECT o.ItemCode AS [Item] , 
        tm.ItemName AS Dscription , 
        o.Warehouse AS Wr , 
        obtn.LotNumber , 
        itl1.quantity AS qty , 
        tm.U_Reusb 
      FROM  OINM o 
        INNER JOIN OITL ON OITL.DocType = o.TransType 
             AND OITL.DocNum = o.BASE_REF 
             AND OITL.DocLine = o.DocLineNum 
             AND OITL.LocCode = o.Warehouse 
             AND o.ItemCode = OITL.ItemCode 
        INNER JOIN ITL1 ON ITL1.LogEntry = OITL.LogEntry 
             AND ITL1.ItemCode = OITL.ItemCode 
        INNER JOIN OITM tm ON tm.ItemCode = ITL1.ItemCode 
        INNER JOIN OITB ON tm.ItmsGrpCod = OITB.ItmsGrpCod 
        INNER JOIN OWHS AS OH ON o.Warehouse = OH.WhsCode 
        INNER JOIN OBTN ON OBTN.SysNumber = ITL1.SysNumber 
             AND OBTN.ItemCode = ITL1.ItemCode 
             AND tm.ManBtchNum = 'Y' 
      WHERE  --tm.ItmsGrpCod=108 and 
        tm.ItemCode IN (SELECT CODE FROM [dbo].[CurrProduction](118, '15.APRIL.2015')) 
        AND o.DocDate <= @todate 
     ) AS s PIVOT 
(SUM(qty) FOR Wr IN ([DIS], [G&I], [GD-001], [GD-002], [GD-003], [GD-004], 
         [GD-005], [GD-006], [GD-007], [GD-008], [GD-009], 
         [GD-010], [GD-011], [GD-012], [GD-013], [GD-014], 
         [GD-015], [GD-016], [GD-017], [GD-018], [GD-019], 
         [GD-020], [GD-021], [GD-022], [GD-023], [GD-024], 
         [GD-025], [GD-026], [GD-027], [GD-028], [GD-029], 
         [GD-030], [GD-031], [GD-032], [GD-033], [GD-034], 
         [GD-035], [KHI AB], [KHI MM], [Loan], [LUB], [Main], 
         [PCG - M1], [PCG - M2], [PHS], [PMG], [PRO], [REJ], 
         [REP], [REP-V], [Selling], [SKP]))AS PVT 
+0

它的工作很好謝謝 –