0

下面是我从网上找到的示例构建的代码,我找不到链接,但在此堆栈溢出问题的答案中引用了该代码:为 Reporting Services 中的单个参数传递多个值

这是我现在在存储过程中使用的 SQL 代码,这是一个很长的过程,所以我将其总结为我正在处理的部分,并添加了DECLAREand SETfor @EMPLOYEES,它们作为参数从 SSRS 传递到使代码片段运行。

DECLARE @EMPLOYEES varchar(8000)

-- EMPLOYEES is a comma separated list of EMPLOYEE IDS 
-- FROM SSRS Report Parameters. Each ID is 12 characters
-- And there are 806 Employees to choose from, which 
-- when all are selected, the Comma separated string grows 
-- to 11,193 characters, much longer than 8000
SET @EMPLOYEES = 'EMP000000001,EMP000000002,EMP000000003'

CREATE TABLE #EMPLOYEEIDS
(
   EMPLOYEEID varchar(100) NOT NULL
)

DECLARE @CharIndex AS int
DECLARE @Piece AS varchar(100)

-- FILL THE #EMPLOYEEIDS TABLE WITH THE COMMA SEPARATED EMPLOYEE IDS
SELECT @CharIndex = 1
WHILE @CharIndex > 0 AND LEN(@EMPLOYEES) > 0
BEGIN
   SELECT @CharIndex = CHARINDEX(',', @EMPLOYEES)
   IF @CharIndex > 0
      SELECT @Piece = LEFT(@EMPLOYEES, @CharIndex - 1)
   ELSE
      SELECT @Piece = @EMPLOYEES

   INSERT INTO #EMPLOYEEIDS (EMPLOYEEID) VALUES (@Piece)
   SELECT @EMPLOYEES = RIGHT(@EMPLOYEES, LEN(@EMPLOYEES) - @CharIndex)
END

SELECT * FROM #EMPLOYEEIDS

DROP TABLE #EMPLOYEEIDS

我有 6 组多值,它们都工作得很好,直到我发现报告缺少员工的大部分数据,我发现VARCHAR(8000)在选择报告参数上的所有员工时溢出(有超过 800 个)。报告会运行,SQL 会愉快地将这些字符截断VARCHAR为 8000 个字符,并且四分之一的 IDS 没有被解析。

所以我尝试将其切换VARCHAR为文本字段,当该字段设置为 TEXT 时,任何解析功能都不起作用。我收到如下错误:

消息 8116,级别 16,状态 2,过程 usp_QualityMonitoring_AllProfiles_SelectWithParameters,第 89 行
参数数据类型文本对于左函数的参数 1 无效。

这是可以理解的,我知道许多可以使用的功能VARCHAR将无法使用TEXT. 因此,当我使用 a 时,SQL 会截断 8000 个字符后的所有内容VARCHAR,如果我将其切换为TEXT.

  • 我必须将多值参数从 SSRS 传递到可以支持这么多选项的 SQL Server 存储过程,还有哪些其他选项?
  • 或者有没有办法修复存储过程中的代码来解析TEXT而不是VARCHAR

注意:我原本以为运行 Stored Proc 的 SQL Server 是 2005,但我确定它不是:

SELECT @@VERSION
-- Microsoft SQL Server  2000 - 8.00.2039 (Intel X86)   May  3 2005 23:18:38   Copyright (c) 1988-2003 Microsoft Corporation  Standard Edition on Windows NT 5.2 (Build 3790: Service Pack 2) 
4

0 回答 0