2014-04-01 163 views
0

给定一个CustomerInvoiceId,这个函数应该返回一串连接的项目号。但是,我不明白为什么它只返回一个逗号,我想也许是因为它只执行一次。为什么tsql函数中的循环只执行一次?

ALTER FUNCTION [dbo].[ConcatProductNumbers] 
(
    @CustomerInvoiceId INT = 0 
) 
RETURNS VARCHAR 
AS 
BEGIN 

-- Declare the return variable here 
DECLARE @count INT = 0, 
@i INT = 1, 
@strProjectNumber VARCHAR(MAX) = ''; 
DECLARE @Ci_ProjectNumber TABLE 
(
    Id INT NOT NULL IDENTITY(1, 1), 
    ProjectNumber VARCHAR(50) 
) 

-- Add the T-SQL statements to compute the return value here 

INSERT INTO @Ci_ProjectNumber (ProjectNumber) 
SELECT pa.ProjectNumber 
FROM ProjectsActive pa 
JOIN ProjectsActiveInvoicing pai 
ON pa.OrderID = pai.OrderID 
WHERE pai.CustomerInvoiceId = @CustomerInvoiceId; 

SELECT @count = COUNT(*) FROM @Ci_ProjectNumber 

WHILE @count > @i 
    BEGIN 
     SELECT @strProjectNumber = (@strProjectNumber + ', ' + ci.ProjectNumber) 
     FROM @Ci_ProjectNumber ci 
     WHERE ci.Id = @i;  

     SET @i = @i + 1; 
    END 

-- Return the result of the function  
RETURN @strProjectNumber 

END 

然而,当我删除功能只保留了语句中,并与PRINT @strProjectNumber更换RETURN @strProjectNumber的确定指标,它的工作原理。任何理由?

感谢您的帮助

+1

将您的RETURNS行从“RETURNS VARCHAR”更改为“RETURNS VARCHAR(8000)” –

+0

非常感谢。这就是答案。但你评论而不是写一个答案。 – Richard77

回答

1

如果目标是获得一个逗号分隔的项目数的列表,你可以考虑使用COALESCE,而不是一个循环。

SELECT @strProjectNumber = COALESCE(@strProjectNumber+',' ,'') + ProjectNumber 
FROM ProjectsActive pa 
JOIN ProjectsActiveInvoicing pai 
ON pa.OrderID = pai.OrderID 
WHERE pai.CustomerInvoiceId = @CustomerInvoiceId; 



RETURN @strProjectNumber 
+0

如果ProjectNumber列可以包含NULL,那么您应该在where子句中过滤:并且ProjectNumber IS NOT NULL –

+0

非常感谢。 – Richard77