我在服務器 1 上有一個 SSIS 包。它通過 OLEDB 源 sql 命令文本對位于服務器 2 上的 SQL db 執行 SQL 查詢。查詢是:
SELECT * FROM PRODUCTS
WHERE PRODUCT_NAME IN (?)
這失敗了,因為?是標量值而不是表。要解決此問題,有 2 個選項:
- 使用 STRING_SPLIT
使用 OLE DB 源 SQL 命令
如果您使用的是 OLE DB 源組件,則可以使用以下 SQL 命令:
DECLARE @String varchar(100) = ?; SELECT * FROM PRODUCTS WHERE PRODUCT_NAME IN ( SELECT LTRIM(RTRIM(Split.a.value('.', 'VARCHAR(100)'))) 'Value' FROM ( SELECT CAST ('<M>' REPLACE(@String , ',', '</M><M>') '</M>' AS XML) AS Data ) AS A CROSS APPLY Data.nodes ('/M') AS Split(a) )測驗
使用
AdventureWorks2017資料庫,我使用以下查詢來搜索存盤在[Person].[Person]表中的人的資訊,而過濾器位于PersonType列上:DECLARE @String varchar(100) = ?; SELECT * FROM [AdventureWorks2017].[Person].[Person] WHERE PersonType IN ( SELECT LTRIM(RTRIM(Split.a.value('.', 'VARCHAR(100)'))) 'Value' FROM ( SELECT CAST ('<M>' REPLACE(@String , ',', '</M><M>') '</M>' AS XML) AS Data ) AS A CROSS APPLY Data.nodes ('/M') AS Split(a) )
在 OLE DB 源代碼編輯器中,如果我們單擊“引數”按鈕,則會識別一個引數。我將創建一個新變數并將其用作引數,如下圖所示:

變數資料型別應該設定為
String,并且值設定為列中EM,SC使用的兩個符號PersonType。
現在,如果我們單擊OLE DB 源編輯器中的“預覽”按鈕,準確的資料將被可視化。

uj5u.com熱心網友回復:
您可以將字串加載到引數物件 @ProductNames 中,然后將其用作源,然后將產品表內部連接到另一個資料流中。
第一個 DF:使用 @stringToParse 作為變數的腳本組件源。在 ProductName 的 DF 中也有輸出字串。
代碼:
string prods = Variables.stringToParse.Value; string[] productNames = prods.Split(','); foreach(string p in productNames) { OutputBuffer0.AddRow(); OutputBuffer0.ProductName = p; }然后將結果加載到映射到@ProductNames 的記錄集目標中。
第二個DF:2個來源。
- 產品表
- 你的記錄集@ProductNames
做一個合并連接(內部),你就會有你的記錄。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/397834.html標籤:sql sql-server 查询语句 姐姐 等
