Avatar billede hnteknik Novice
08. januar 2007 - 21:35 Der er 1 løsning

Inline function i stored procedure - hvordan lige

Jeg har en function som beregner antal tagne skemaer for en given gruppe og et givet skema:

CREATE FUNCTION dbo.AIM_fn_CountTagne
(   
    -- Add the parameters for the function here
    @intSurveyID int,
    @groupName varchar(100)
)
RETURNS TABLE
AS
RETURN
(
    -- Add the SELECT statement with parameter references here
        SELECT COUNT(dbo.usd_Response.surveyID) AS Tagne
        FROM dbo.usd_Response INNER JOIN
          dbo.usd_surveyToGroupMap ON dbo.usd_Response.surveyID = dbo.usd_surveyToGroupMap.surveyID INNER JOIN
        dbo.usd_userGroupMap ON dbo.usd_Response.userID = dbo.usd_userGroupMap.userID
        WHERE (dbo.usd_surveyToGroupMap.groupName = @groupName) AND (dbo.usd_userGroupMap.groupName = @groupName) AND
        (dbo.usd_Response.surveyID =  @intSurveyID  )
)
GO

Den virker fint nok

En eller anden okkenok har lavet en binding, som knytter sig til navnet på gruppen og ikke dets ID, så det skal lige slåes op først og det hele kombineres i en select.

Jeg har forsøgt at køre proceduren med functionen inline:

ALTER PROCEDURE [dbo].[AIM_GrpRspMaxTimes]
    -- Add the parameters for the stored procedure here
    @intSurveyID int = 0,
    @intUserID int = 0
AS
BEGIN
    SET NOCOUNT ON;
    -- Dette select giver det eller de gruppenavne , som user tilhører qua den valgte surveyid
    -- normalt kun en, men....
    SELECT  usd_userGroupMap.groupName, usd_surveyToGroupMap.MaxResponses,dbo.AIM_fn_CountTagne(@intSurveyID,groupName)
            FROM        usd_userGroupMap INNER JOIN
            usd_surveyToGroupMap ON usd_userGroupMap.groupName = usd_surveyToGroupMap.groupName
            WHERE    (usd_userGroupMap.userID =  @intUserID)  AND (usd_surveyToGroupMap.surveyID = @intSurveyID )

END

men får følgende:

Cannot find either column "dbo" or the user-defined function or aggregate "dbo.AIM_fn_CountTagne", or the name is ambiguous.

Var jeg lige lidt for smart ?
Hvor fletter man sådan en fucntion inline i ovenstående ?
Avatar billede hnteknik Novice
09. januar 2007 - 19:37 #1
Kommer tid kommer sted - Jeg fandt ud problemet.
Count funktionen skulle laves om til en scalar funktion som jeg lagde i en inline table function.

Næsten det samme men alligevel:

ALTER FUNCTION [dbo].[AIM_fn_CountTagne]
(   
    -- Add the parameters for the function here
    @intSurveyID int,
    @groupName varchar(100)
)
RETURNS int
AS
begin
declare @return int

    -- Add the SELECT statement with parameter references here
        SELECT @return = COUNT(dbo.usd_Response.surveyID)
        FROM dbo.usd_Response INNER JOIN
          dbo.usd_surveyToGroupMap ON dbo.usd_Response.surveyID = dbo.usd_surveyToGroupMap.surveyID INNER JOIN
        dbo.usd_userGroupMap ON dbo.usd_Response.userID = dbo.usd_userGroupMap.userID
        WHERE (dbo.usd_surveyToGroupMap.groupName = @groupName) AND (dbo.usd_userGroupMap.groupName = @groupName) AND
        (dbo.usd_Response.surveyID =  @intSurveyID  )

return  @return
end

---
create FUNCTION [dbo].[AIM_fn_GrpRspMaxTimes]
(   
    -- Add the parameters for the function here
    @intSurveyID int = 0,
    @intUserID int = 0
)
RETURNS TABLE
AS
RETURN
(
    SELECT  dbo.AIM_fn_CountTagne(@intSurveyID,usd_userGroupMap.groupName) as Tagne, usd_userGroupMap.groupName, usd_surveyToGroupMap.MaxResponses
        FROM        usd_userGroupMap INNER JOIN
        usd_surveyToGroupMap ON usd_userGroupMap.groupName = usd_surveyToGroupMap.groupName
        WHERE    (usd_userGroupMap.userID =  @intUserID)  AND (usd_surveyToGroupMap.surveyID = @intSurveyID )
)

--

som kaldes bl.a. sådan
select * from  dbo.AIM_fn_GrpRspMaxTimes(228,2)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester