我在客户端的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
答案 0 :(得分:1)
尝试为SP参数定义比例 -
CREATE PROCEDURE usp_function_test (@SiteID varchar(max))
当您声明一个没有比例的varchar
参数时,它默认为1 - 您的输入值被静默截断。
此处参考 - http://msdn.microsoft.com/en-us/library/ms176089.aspx