在select中列出值列表中调用udf

时间:2011-02-01 16:55:45

标签: sql-server-2005 user-defined-functions

我有一个我正在选择的项目列表,并且还希望包含来自混合的UDF的一些值。

我在项目管理系统的不同角色中提取人名。

其中有一个名称我希望得到它的首字母,所以我想在select Abbreviate中使用混合的fn_ProjectStakeholders UDF,这样它就会返回名字和首字母的名字作为其名称结果

请参阅以下部分:

        ExecutiveChampion NVARCHAR(500), 
        -- Abbreviate (ExecutiveChampion) as ExecutiveChampionInit,
        BusinessOwner NVARCHAR(500),
        -- Abbreviate (BusinessOwner) as BusinessOwnerInit,

这是我的代码:

CREATE FUNCTION [dbo].[fn_ProjectStakeholders] 
   (  
    @ProjectListCSV VARCHAR(8000)
   ) 

RETURNS @TableOfValues TABLE 
      (
        ProjectId INT,
        ExecutiveChampion NVARCHAR(500), 
        -- Abbreviate (ExecutiveChampion) as ExecutiveChampionInit,
        BusinessOwner NVARCHAR(500),
        -- Abbreviate (BusinessOwner) as BusinessOwnerInit,
        BusinessAnalyst NVARCHAR(500),
        GeneralContractor NVARCHAR(500),
        PrimaryPM NVARCHAR(500),
        DevelopmentManager NVARCHAR(500),
        DevelopmentLead NVARCHAR(500),
        TDM NVARCHAR(500),
        PTM NVARCHAR(500)
      ) 

AS 

BEGIN

DECLARE @pList TABLE (pk INT IDENTITY(1,1),ProjectId INT)    
INSERT INTO @pList (ProjectId) SELECT Value FROM Split(',', @ProjectListCSV)    

INSERT INTO @TableOfValues
SELECT  ProjectId,  
   ISNULL([95],'n/a')  ExecutiveChampion,  
   ISNULL([96],'n/a')  BusinessOwner,  
   ISNULL([97],'n/a')  BusinessAnalyst,  
   ISNULL([100],'n/a') GeneralContractor,  
   ISNULL([101],'n/a') PrimaryPM,  
   ISNULL([102],'n/a') DevelopmentManager,  
   ISNULL([103],'n/a') DevelopmentLead,  
   ISNULL([104],'n/a') TDM,  
   ISNULL([105],'n/a') PTM  
 FROM (
        SELECT pl.ProjectId, StakeholderCID, FullName  
        FROM @pList pl  
            INNER JOIN StatusCode sc  ON 1 = 1  AND SCID IN (8, 9)  
            LEFT JOIN ProjectStakeholder ps ON pl.ProjectId = ps.ProjectId AND sc.CID = ps.StakeholderCID
        ) AS ST  
 PIVOT 
    (MAX(FullName) FOR StakeholderCID IN ([95], [96], [97], [100], [101], [102], [103], [104], [105])) AS PT  

RETURN

END



CREATE FUNCTION dbo.Abbreviate ( @InputString varchar(1000) )
RETURNS VARCHAR(100)
AS
BEGIN
    DECLARE @Index INT
    DECLARE @OutputString VARCHAR(100)

    SET @InputString = LTRIM(@InputString)
    SET @OutputString = UPPER(LEFT(@InputString, 1))
    SET @Index = CHARINDEX(' ', @InputString) + 1

    WHILE @Index > 1 
    BEGIN
        SET @OutputString = @OutputString + UPPER(SUBSTRING(@InputString, @Index, 1)) 
        SET @Index = CHARINDEX(' ', @InputString, @Index) + 1
    END
    RETURN @OutputString
END

1 个答案:

答案 0 :(得分:0)

答案受到question

的启发

我的结果代码是:

select 
    --p.parentprojectid,
    pp.ProjectName as ParentProjectName,
    p.ProjectName as ProjectName,
    p.ClarityId,
    R.Name as releaseName,
    CASE WHEN PSH.GeneralContractor = 'Jeff Jablonski' THEN 'Y' ELSE 'N' END as 'GC',      
    -- cg initials
    PSH.GeneralContractor,
    dbo.Abbreviate(PSH.GeneralContractor),
    p.CaseManagerBenId,
    P.Budget,
    PSH.BusinessOwner,
    PSH.DevelopmentLead ,
    PSH.PrimaryPM,
    PSH.DevelopmentManager,
    -- SA ?!?!!?
    scs.CodeName as latestStatus
    -- 6x true/ false status for link types (with sanity check)

from project p  
    left outer join project pp on pp.projectid = p.parentprojectid
    inner join Release R on R.ReleaseID = P.ReleaseID
    LEFT OUTER JOIN ProjectStatus ps ON ps.ProjectId = p.ProjectId
                                        AND ps.LastUpdate = (SELECT MAX(LastUpdate)      
                                                             FROM ProjectStatus ips      
                                                             WHERE ips.ProjectId = p.ProjectId)      
    LEFT OUTER JOIN StatusCode scs ON scs.CID = ps.RAGStatusCID 
    Left OUTER JOIN fn_ProjectStakeholders ('25,66,97') as PSH  ON PSH.projectId = p.ProjectId

where p.projectId in (25,66,97)