我在客户端的 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