0

クライアントの SQL Server 2005 データベースで作業していますが、奇妙な動作が見られます。2008 年の経験は少しありますが、2005 年の最初の戦いなので、これが私の経験不足に関連する単純なものになることを願っています。

私は何をしようとしていますか?SSRS 2005 で販売ダッシュボードを開発しています。レポート パラメーターの 1 つは、ストアド プロシージャに渡す必要がある複数値パラメーターです。私はいくつかのブログと SO で回避策を見つけ、カンマ区切りの varchar を分割してテーブルを返す関数を実装しました。SSRS データセットのストアド プロシージャを呼び出しているため、プロシージャ内から正しい値を返すには、この関数が必要です。

私の問題:特定の値に対して SSMS 内から関数を直接実行すると、(予想どおり) 7 行のテーブルが表示されます。その関数を呼び出すプロシージャを実行すると、同じ値が渡されて、テーブルに 1 行しか返されません。関数とプロシージャを実行するユーザーは、両方のオブジェクトの所有者でもあります。

質問を投稿する前に、この点に到達するために多くの宿題をしたので、ここで十分な注意を払ったことを願っています. クライアントは SQL プロファイラーを操作する権限を私に与えていないので、その方向に掘り下げることはできませんでした。

これはパーミッションの問題かもしれないと思いましたが、関数がまだ実行されていて、7 行ではなく 1 行を返すという事実に戸惑いました。コンマで区切られた文字列から最初の数字のみを返すようです。

私の質問:以下に概説する動作の原因は何ですか? 追加情報を提供する必要がある場合はお知らせください。

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
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 に答える