我不喜欢在 SQL 语句中使用 Text 参数和 EXEC,就像您引用的文章所描述的那样,这样做会受到 SQL 注入的影响。将查询发送到 SQL 服务器时,具有多值参数的默认 SSRS 行为直接替换以逗号分隔的值列表来代替参数。这对于简单的 IN 查询很有用,但在其他地方可能不受欢迎。通过将 DataSet 上的 Parameter Value 设置为=Join(Parameters!CustomerIDs.Value, ", ")
. 完成后,您可以使用以下 SQL 加载表变量:
DECLARE @CustomerIDsTable TABLE (CustomerID int NOT NULL PRIMARY KEY)
INSERT INTO @CustomerIDsTable (CustomerID)
SELECT DISTINCT TextNodes.Node.value(N'.', N'int') AS CustomerID
FROM (
SELECT CONVERT(XML, N'<A>' + COALESCE(N'<e>' + REPLACE(@CustomerIDs, N',', N'</e><e>') + N'</e>', '') + N'</A>') AS pNode
) AS xmlDocs
CROSS APPLY pNode.nodes(N'/A/e') AS TextNodes(Node)
-- Do whatever with the resulting table variable, i.e.,
EXEC rpt_CustomerTransactionSummary @StartDate, @EndDate, @CustomerIDsTable
如果使用文本而不是整数,那么有几行会像这样更改:
DECLARE @CustomerIDsTable TABLE (CustomerID nvarchar(MAX) NOT NULL PRIMARY KEY)
INSERT INTO @CustomerIDsTable (CustomerID)
SELECT DISTINCT TextNodes.Node.value(N'.', N'nvarchar(MAX)') AS CustomerID
FROM (
SELECT CONVERT(XML, N'<A>' + COALESCE(N'<e>' + REPLACE(@CustomerIDs, N',', N'</e><e>') + N'</e>', '') + N'</A>') AS pNode
) AS xmlDocs
CROSS APPLY pNode.nodes(N'/A/e') AS TextNodes(Node)
-- Do whatever with the resulting table variable, i.e.,
EXEC rpt_CustomerTransactionSummary @StartDate, @EndDate, @CustomerIDsTable
这种方法也适用于处理用户输入的逗号分隔项字符串。