下面是我在网上找到的一个例子构建的代码,我找不到链接,但代码在这个堆栈溢出问题的答案中被引用:Passing multiple values for a single parameter in Reporting Services。
这是我现在在我的存储过程中使用的SQL代码,这是一个很长的过程,所以我把它归结为我正在处理的部分,并添加了DECLARE
和{{1对于SET
,它们作为参数从SSRS传递,以使代码段运行。
@EMPLOYEES
我有6组多值,所有这些都运行良好,直到我发现报告丢失了大部分员工数据,我发现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
在选择所有数据时溢出员工对报告参数(其中有800多个)。报告将运行,SQL会很乐意将VARCHAR(8000)
截断为8000个字符,并且不会解析四分之一的IDS。
所以我尝试将VARCHAR
切换到文本字段,当字段设置为TEXT时,没有任何解析函数可以工作。我收到如下错误:
Msg 8116,Level 16,State 2,Procedure usp_QualityMonitoring_AllProfiles_SelectWithParameters,Line 89
参数数据类型文本对于左函数的参数1无效。
这是可以理解的,我知道许多与VARCHAR
一起使用的功能不适用于VARCHAR
。因此,当我使用TEXT
时,SQL会截断8000个字符后的所有内容,如果我将其切换到VARCHAR
,则该过程将不会运行。
TEXT
而不是TEXT
?注意:我原本以为运行Stored Proc的SQL Server是2005,但我确定它不是:
VARCHAR