参数的 "allow multiple values" 可以与 Report Builder 3.0 中的存储过程一起使用吗?
Can "allow multiple values" for parameters be used with stored procedures in Report Builder 3.0?
Microsoft 表示,在使用存储过程时,您不能在 Report Builder 2.0 中允许一个参数有多个值。
https://technet.microsoft.com/en-us/library/Dd207127(v=SQL.100).aspx
我找不到 Report Builder 3.0 的类似声明。
报表生成器如何将具有多个选择的参数中包含的数据发送到存储过程?
从这个 post 看来,它将它们作为字符串传递,对吗?
https://www.mssqltips.com/sqlservertip/2844/working-with-multiselect-parameters-for-ssrs-reports/
这种方法似乎太复杂了,无法解析 Report Builder 发送到数据库的字符串。
似乎 tables 可以作为参数传递到 SQL Server 2008 中的存储过程中:
How to pass an array into a SQL Server stored procedure
有没有办法将 table 从 Report Builder 3.0 传递到 SQL Server 2008?
是的,可以用。我发现最简单的方法是构造存储过程,使变量为 VARCHAR(MAX) 并且 where 子句使用包含子句。然后使用另一个存储过程来分解将要传递的逗号分隔变量。
Example
@States = 'CA,NM,NY'
Select *
from Table
Where State in (Select CSVResults from parsecsv(@States,',')
这当然假设您有一个名为 Parsecsv 的函数。如果你需要我用。
CREATE FUNCTION [dbo].[ParseCSV] (@CSV_STR VARCHAR(8000),@Delimiter varchar(20) )
RETURNS @splittable TABLE (ID int identity(1,1), CSVvalues VARCHAR(256) )
AS
BEGIN
-- Check for NULL string or empty sting
IF (LEN(@CSV_STR) < 1 OR @CSV_STR IS NULL)
BEGIN
RETURN
END
; WITH csvtbl(i,j)
AS
(
SELECT i=1, j= CHARINDEX(@Delimiter,@CSV_STR+@Delimiter)
UNION ALL
SELECT i=j+1, j=CHARINDEX(@Delimiter,@CSV_STR+@Delimiter,j+1)
FROM csvtbl
WHERE CHARINDEX(@Delimiter,@CSV_STR+@Delimiter,j+1) <> 0
)
INSERT INTO @splittable ( CSVvalues)
SELECT LTRIM(RTRIM(SUBSTRING(@CSV_STR,i,j-i)))
FROM csvtbl OPTION (MAXRECURSION 32767)
RETURN
END
Microsoft 表示,在使用存储过程时,您不能在 Report Builder 2.0 中允许一个参数有多个值。 https://technet.microsoft.com/en-us/library/Dd207127(v=SQL.100).aspx
我找不到 Report Builder 3.0 的类似声明。 报表生成器如何将具有多个选择的参数中包含的数据发送到存储过程? 从这个 post 看来,它将它们作为字符串传递,对吗? https://www.mssqltips.com/sqlservertip/2844/working-with-multiselect-parameters-for-ssrs-reports/
这种方法似乎太复杂了,无法解析 Report Builder 发送到数据库的字符串。
似乎 tables 可以作为参数传递到 SQL Server 2008 中的存储过程中: How to pass an array into a SQL Server stored procedure 有没有办法将 table 从 Report Builder 3.0 传递到 SQL Server 2008?
是的,可以用。我发现最简单的方法是构造存储过程,使变量为 VARCHAR(MAX) 并且 where 子句使用包含子句。然后使用另一个存储过程来分解将要传递的逗号分隔变量。
Example
@States = 'CA,NM,NY'
Select *
from Table
Where State in (Select CSVResults from parsecsv(@States,',')
这当然假设您有一个名为 Parsecsv 的函数。如果你需要我用。
CREATE FUNCTION [dbo].[ParseCSV] (@CSV_STR VARCHAR(8000),@Delimiter varchar(20) )
RETURNS @splittable TABLE (ID int identity(1,1), CSVvalues VARCHAR(256) )
AS
BEGIN
-- Check for NULL string or empty sting
IF (LEN(@CSV_STR) < 1 OR @CSV_STR IS NULL)
BEGIN
RETURN
END
; WITH csvtbl(i,j)
AS
(
SELECT i=1, j= CHARINDEX(@Delimiter,@CSV_STR+@Delimiter)
UNION ALL
SELECT i=j+1, j=CHARINDEX(@Delimiter,@CSV_STR+@Delimiter,j+1)
FROM csvtbl
WHERE CHARINDEX(@Delimiter,@CSV_STR+@Delimiter,j+1) <> 0
)
INSERT INTO @splittable ( CSVvalues)
SELECT LTRIM(RTRIM(SUBSTRING(@CSV_STR,i,j-i)))
FROM csvtbl OPTION (MAXRECURSION 32767)
RETURN
END