2017-08-04 3 views
0

Lors de l'utilisation de plusieurs fonctions de table dans une requête comme ci-dessous, SSMS génère une erreur. En outre, le paramètre [Date] de [PRECALCPAGES_asof] est souligné en rouge. J'essaie de comprendre pourquoi cela échoue. Je pense que cela peut être lié à la façon dont le moteur SQL Server fonctionne. J'ai regardé dans la documentation sur MSDN mais malheureusement je ne sais pas quoi chercher. Pourquoi cela est-il causé et existe-t-il un moyen de contourner le problème?L'utilisation répétée d'un paramètre pour plusieurs UDF dans FROM déclenche une erreur de nom de colonne non valide.

Recherche

SELECT 
    [Date] 
    , COUNT(*) 
FROM 
    [Warehouse].[dbo].[DimDate] 
    CROSS APPLY 
    [PROJECTS_asof]([Date]) 
    INNER JOIN 
    [PRECALCPAGES_asof]([Date]) ON [PRECALCPAGES_asof].[PROJECTID] = [PROJECTS_asof].[PROJECTID] 
GROUP BY 
    [Date] 

Erreur

Msg 207, Level 16, State 1, Line 9 
Invalid column name 'Date'. 

Fonctions

CREATE FUNCTION [ProfitManager].[PROJECTS_asof] 
(
    @date DATETIME 
) 
RETURNS TABLE AS 
RETURN 
(
    SELECT 
     [PROJECTID] 
     , [PROJECT] 
     , ... 
    FROM 
     Profitmanager.[PROJECTS_HISTORY] 
    WHERE 
     [RowStartDate] <= @date 
     AND 
     [RowEndDate] > @date 
) 
GO 

CREATE FUNCTION [ProfitManager].[PRECALCPAGES_asof] 
(
    @date DATETIME 
) 
RETURNS TABLE AS 
RETURN 
(
    SELECT 
     [PAGEID] 
     , [PAGENAME] 
     , ... 
    FROM 
     Profitmanager.[PRECALCPAGES_HISTORY] 
    WHERE 
     [RowStartDate] <= @date 
     AND 
     [RowEndDate] > @date 
) 
GO 

Répondre

2

Je pense que vous ne pouvez pas utiliser des champs f rom tables en tant que paramètres d'une fonction dans une jointure. Vous devriez utiliser cross apply.

SELECT 
    [Date] 
    , COUNT(*) 
FROM 
    [Warehouse].[dbo].[DimDate] 
    CROSS APPLY 
    [PROJECTS_asof]([Date]) 
    CROSS APPLY 
    [PRECALCPAGES_asof]([Date]) 
WHERE 
    [PRECALCPAGES_asof].[PROJECTID] = [PROJECTS_asof].[PROJECTID] 
GROUP BY 
    [Date] 
+0

merci, c'est la réponse que je cherchais! – RB84

+0

Super, merci! Veuillez marquer la réponse comme acceptée si elle a résolu votre problème. – SAS

+0

Savez-vous peut-être pourquoi cela fonctionne de cette façon? – RB84