0

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

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

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

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

我认为这可能是权限问题,但该函数仍在执行并且确实返回 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

选择语句的输出:

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
4

1 回答 1

1

尝试为 SP 参数定义一个比例 -

CREATE PROCEDURE usp_function_test (@SiteID varchar(max))

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

参考这里 - http://msdn.microsoft.com/en-us/library/ms176089.aspx

于 2012-05-25T18:08:18.880 回答