用户定义的函数从内部存储过程调用时返回不同的结果

时间:2012-05-25 17:45:20

标签: tsql sql-server-2005 reportingservices-2005

我在客户端的SQL Server 2005数据库中工作,我看到了一些奇怪的行为。我对2008年有一点经验,但这是我与2005年的第一次战斗,所以我希望这与我的经验不足有关。

我想做什么?我正在开发SSRS 2005中的销售仪表板。其中一个报表参数是一个多值参数,我需要将其传递给存储过程。我在一些博客中找到了解决方法,并在SO上找到了解决方法,并实现了一个分割逗号分隔的varchar的函数,并返回一个表。我需要此函数从过程中返回正确的值,因为我正在调用SSRS数据集的存储过程。

我的问题:当我直接从SSMS中为给定值执行该函数时,我收到一个包含7行的表(如预期的那样)。当我执行一个调用该函数的过程时,传递相同的值,它只返回表中的1行。执行该功能的用户和程序也是两个对象的所有者。

在发布问题之前,我做了很多功课来达到这一点,所以我希望我已经完成了我的尽职调查。客户端没有授予我使用SQL事件探查器的权限,所以我无法向这个方向挖掘。

我想也许这可能是一个权限问题,但事实上该函数仍然执行并且确实返回1行而不是7行让我困惑。它似乎只返回逗号稀释字符串中的第一个数字。

我的问题:导致下面列出的行为的原因是什么?如果我应该提供任何其他信息,请告诉我。

从SSMS执行:

declare 

    @SiteID varchar(max);

    set @SiteID = '1,2,3,4,5,6,7';

BEGIN

exec usp_function_test @SiteID;

select * from udf_rpt_multivalueparamtotable(@SiteID,',',1)

END

程序输出:

Val
---
1

select语句的输出:

Val
---
1
2
3
4
5
6
7

功能代码:

CREATE FUNCTION [dbo].[udf_RPT_MultiValueParamToTAble](
            @String VARCHAR(max), /* input string */
   @Delimeter char(1),   /* delimiter */
   @TrimSpace bit )      /* kill whitespace? */
RETURNS @Table TABLE ( [Val] VARCHAR(4000) )
AS

BEGIN
    DECLARE @Val    VARCHAR(4000)
    WHILE LEN(@String) > 0
    BEGIN
        SET @Val    = LEFT(@String,
             ISNULL(NULLIF(CHARINDEX(@Delimeter, @String) - 1, -1),
             LEN(@String)))
        SET @String = SUBSTRING(@String,
             ISNULL(NULLIF(CHARINDEX(@Delimeter, @String), 0),
             LEN(@String)) + 1, LEN(@String))
  IF @TrimSpace = 1 Set @Val = LTRIM(RTRIM(@Val))
    INSERT INTO @Table ( [Val] )
        VALUES ( @Val )
    END
    RETURN
END

测试程序代码:

CREATE PROCEDURE usp_function_test (@SiteID varchar)
AS

SET NOCOUNT ON

BEGIN

select * from udf_rpt_multivalueparamtotable(@SiteID,',',1)

END

1 个答案:

答案 0 :(得分:1)

尝试为SP参数定义比例 -

CREATE PROCEDURE usp_function_test (@SiteID varchar(max))

当您声明一个没有比例的varchar参数时,它默认为1 - 您的输入值被静默截断。

此处参考 - http://msdn.microsoft.com/en-us/library/ms176089.aspx