Sql-Server
將列表傳遞給 SSIS 中的 SQL 查詢
我需要能夠將包含諸如 (‘1900’),(‘1920’),… 之類的數字的未定義大小列表傳遞給 SSIS 中的 OLE DB 源。
截至目前,我正在嘗試很多不起作用的不同方法。
declare @fieldLogID nvarchar(256) = ? declare @accountTypes int = ? select fl.[Version] ,fl.ObjectID ,[FieldLogID] ,Cast(fl.WorkStartDateTime as date) as WorkStartDate ,Cast(fl.WorkStartDateTime as time) as WorkStartTime... ... where fleja.FieldLog_FieldLogID IN (@fieldLogID)
@fieldLogID 將包含所有傳入的數字。數字格式無關緊要,它們可以是字元串、整數等。只要我們傳遞一個列表即可。
關於如何做到這一點的任何提示?
您是否嘗試過使用動態 sql?像這樣的東西:
declare @fieldLogID nvarchar(256) = ? declare @accountTypes int = ? declare @sql nvarchar(1000) = '' SET @sql = 'select fl.[Version] ,fl.ObjectID ,[FieldLogID] ,Cast(fl.WorkStartDateTime as date) as WorkStartDate ,Cast(fl.WorkStartDateTime as time) as WorkStartTime... ... where fleja.FieldLog_FieldLogID IN (' + @fieldLogID + ')' EXEC (@sql)
語法可能有點偏離,@sql nvarchar 變數類型可能需要進一步擴展。@fieldLogID 的格式需要是這樣的:
@fieldLogID = n'''1800'',''1900'',''2000'''
您可以隨時將其列印到螢幕上以驗證您的語法,而不是執行 @sql 變數。使用這種方法我會有點擔心@fieldLogID 變數,我想驗證它是正確的,並且沒有惡意。
除非 @fieldLogID 變數是“TABLE”類型而不是單值類型,否則您的“IN”語句將不起作用。
您可以:
將“IN”切換為“LIKE”並將兩者顛倒過來,這樣(這有點懶惰並且對資源徵稅,LIKE 有點貴):
WHERE @fieldLogID LIKE '%' + fleja.FieldLog_FieldLogID + '%'
或者(和我的首選方法)您可以將 @fieldLogID 聲明為單列表變數
DECLARE @fieldLogID TABLE AS (FieldLogID NVARCHAR(256)); INSERT INTO @fieldLogID (FieldLogID) SELECT [COLUMN] FROM [FieldLogDataSourceTable]
然後你就可以使用你最初的 WHERE 子句了,因為 @fieldLogID 現在是一個表:
where fleja.FieldLog_FieldLogID IN (SELECT [FieldLogID] FROM @fieldLogID)
如果 IN 的資源過於昂貴,您也可以嘗試 WHERE EXISTS,但這有點複雜:
WHERE EXISTS (SELECT [FieldLogID] FROM @FieldLogID INNER JOIN [fleja] ON [fleja].[FieldLog_FieldLogID] = [FieldLogID])