Sql-Server

將列表傳遞給 SSIS 中的 SQL 查詢

  • July 15, 2016

我需要能夠將包含諸如 (‘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])

引用自:https://dba.stackexchange.com/questions/143998