我不喜歡在SQL語句中使用Text參數和EXEC,就像您引用的文章描述的一樣,這樣做會受到SQL注入的影響。使用多值參數的默認SSRS行爲將查詢發送到SQL服務器時,會直接替換逗號分隔的值列表以代替參數。這對於簡單的IN查詢非常有用,但在其他地方可能不太合適。通過將DataSet上的參數值設置爲=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
這種方法也適用於處理用戶輸入的逗號分隔項目的字符串。
第一個錯誤通常是由於不匹配的類型/長度造成的。比較數據庫的數據類型/長度和您的期望值。 – 2013-03-11 20:38:10