0

いくつかのパラメーターを含むストアド プロシージャを使用する SSRS レポートに取り組んでいます。

私が問題を抱えているパラメーターの 1 つは、複数の項目 (GUID 値) を選択するオプションがあり、それらが 4000 以上のコンマ区切り値を超えているためです。

ストア プロシージャ: proc_GetCompanyRecord

========================================

CREATE PROCEDURE [dbo].[proc_GetCompanyRecord]
    (
    @Year AS VARCHAR(MAX) = NULL,
    @CoreCompanyId AS VARCHAR(MAX) = NULL,
    @CompanyId AS VARCHAR(MAX) = NULL,
    @OwnerId VARCHAR(MAX) = NULL
    )

--THE REST OF MY QUERY HERE WHICH PULLS ALL OF THE NEEDED COLUMNS

WHERE CoreCompany.CoreCompanyId in (SELECT * FROM ufnSplit (@CoreCompanyId, ','))
AND Company.CompanyId in (SELECT * FROM ufnSplit (@CompanyId, ','))

========================================

関数: [dbo].[ufnSplit]

CREATE FUNCTION [dbo].[ufnSplit]
(
    @RepParam varchar(MAX),
    @Delim char(1)
)
RETURNS @Values TABLE (Item UNIQUEIDENTIFIER)
AS
BEGIN
  DECLARE @chrind INT
  DECLARE @Piece varchar(MAX)
  SELECT @chrind = 1 
  WHILE @chrind > 0
    BEGIN
      SELECT @chrind = CHARINDEX(@Delim,@RepParam)
      IF @chrind  > 0
        SELECT @Piece = LEFT(@RepParam,@chrind - 1)
      ELSE
        SELECT @Piece = @RepParam
      INSERT  @Values(Item) VALUES(@Piece)
      SELECT @RepParam = RIGHT(@RepParam,LEN(@RepParam) - @chrind)
      IF LEN(@RepParam) = 0 BREAK
    END
  RETURN
  END

@CompanyId パラメータに 4000 以上の値を指定してストアド プロシージャを実行しようとすると、正常に動作し、可能なすべてのレコードが返されます。

しかし、CRM にレポートを展開した後、レポートを実行して [レポートの表示] をクリックすると、「エラーが発生しました」というエラーが表示されます。

私はそれを診断し、4000 以上の GUID コンマ区切り値がストア プロシージャと IN ステートメントには多すぎることを発見しました。

メッセージ 8152、レベル 16、状態 10、行 7 文字列またはバイナリ データが切り捨てられます。

助けてください!

4

1 に答える 1

1

@CompanyID パラメータ クエリを作成するとき。「すべて選択」のオプションを追加します。

SELECT 'Select All' AS CompanyID, 1 as myOrder
 UNION
 Select CAST(CompanyID AS VARCHAR), 2 as myOrder
 FROM CompanyTable
 ORDER BY myOrder

これにより、ユーザーは 4000 個の値すべてを選択する必要がなくなり、[すべて選択] オプションを選択するだけですべてが選択されます。そして、CompanyID の新しい「すべて選択」値を処理するように proc_getCompanyRecord を更新します。

CREATE PROCEDURE [dbo].[proc_GetCompanyRecord]
    (
    @Year AS VARCHAR(MAX) = NULL,
    @CoreCompanyId AS VARCHAR(MAX) = NULL,
    @CompanyId AS VARCHAR(MAX) = NULL,
    @OwnerId VARCHAR(MAX) = NULL
    )

--THE REST OF MY QUERY HERE WHICH PULLS ALL OF THE NEEDED COLUMNS

WHERE CoreCompany.CoreCompanyId in (SELECT * FROM ufnSplit (@CoreCompanyId, ','))
AND (Company.CompanyId in (SELECT * FROM ufnSplit (@CompanyId, ',')) OR Company.CompanyID = 'Select All')
于 2013-08-12T10:42:39.227 に答える