下面是我从网上找到的示例构建的代码,我找不到链接,但在此堆栈溢出问题的答案中引用了该代码:为 Reporting Services 中的单个参数传递多个值。
这是我现在在存储过程中使用的 SQL 代码,这是一个很长的过程,所以我将其总结为我正在处理的部分,并添加了DECLARE
and SET
for @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)