SSIS 查找转换未捕获非匹配值
SSIS Lookup transformation not capturing non matching values
我正在使用查找转换回顾我的数据仓库 table 以查找从生产中删除的任何记录,然后将它们发送到临时 table 以便从数据仓库中删除 table.
从逻辑上讲,如果记录在生产环境中被删除 table 并且存在于数据仓库中 table 此查找应该找到它并将其重定向到 No Match Output
正确吗?
问题是查找没有找到不匹配的记录,或者我正在做一些倒退的事情。
我应该补充一点,在生产环境中,四个不同的区域有 4 个相同的数据库。我的包通过遍历配置文件中的连接字符串来遍历每个包。然后所有这些记录都用它们来自哪个数据库标记并添加到数据仓库table.
这是我的数据流任务中无法正常工作的部分:
在 "Fact Table" OLE DB 源中,我从我的事实 table 中提取记录,其中 Region
等于连接字符串使用数字 1 - 4 标识的区域。我将查询放在一个变量中,以便它可以是动态的。我也只在暂存 table 中提取不能为空的列,以尽量减少我提取的数量,我只 真的 需要 ID 和 Region 列删除记录,因为它们在各自的区域内应该是唯一的。
内部FindDeletes
变量:
"SELECT ID ,
ParentItemID ,
IsTransPerPiece ,
PerPieceCostQuantity ,
PerPieceCost ,
PerPieceUnitCost ,
OriginalPerPieceCostQuantity ,
OriginalTransFee ,
TransFee ,
CostTrans ,
CostLabor ,
OriginalCostQuantity ,
OriginalFacilityFees ,
FacilityFees ,
Region ,
HashValue ,
CreateDate
FROM dbo.FactInvoiceWasteManifests
WHERE Region = CASE " + (DT_WSTR, 2) @[User::ConnectionStringID] +
" WHEN 1 THEN 'NE'
WHEN 2 THEN 'BALT'
WHEN 3 THEN 'NY'
WHEN 4 THEN 'PA'
END "
内部 OLE DB 源显示变量查询:
接下来我们进行转换,我将不匹配的行重定向到 No Match Output
这里连接到生产环境,这里的查询也是动态的,因为 Region
列在生产环境中不存在。
显示查找 SQL 查询的表达式:
"SELECT ID,
CASE " + (DT_WSTR, 2) @[User::ConnectionStringID] +
" WHEN 1 THEN CAST('NE' AS NVARCHAR(25))
WHEN 2 THEN CAST('BALT' AS NVARCHAR(25))
WHEN 3 THEN CAST('NY' AS NVARCHAR(25))
WHEN 4 THEN CAST('PA' AS NVARCHAR(25))
END AS Region
FROM dbo.InvoiceWasteManifests;"
更新查询:
"SELECT ID,
CASE
WHEN " + (DT_WSTR, 2) @[User::ConnectionStringID] + "=1 THEN CAST('NE' AS NVARCHAR(25))
WHEN " + (DT_WSTR, 2) @[User::ConnectionStringID] + "=2 THEN CAST('BALT' AS NVARCHAR(25))
WHEN " + (DT_WSTR, 2) @[User::ConnectionStringID] + "=3 THEN CAST('NY' AS NVARCHAR(25))
WHEN " + (DT_WSTR, 2) @[User::ConnectionStringID] + "=4 THEN CAST('PA' AS NVARCHAR(25))
END AS Region
FROM dbo.InvoiceWasteManifests;"
最后,我加入了 Region
上的两个 table,然后搜索 ID。结果是没有任何反应,也没有任何记录被重定向到任何地方。
这是您需要输入的第一个动态查询:
--declare @sql varchar(max)
--declare @ConnectionStringID varchar(50) =1
set @sql =
'SELECT ID ,
ParentItemID ,
IsTransPerPiece ,
PerPieceCostQuantity ,
PerPieceCost ,
PerPieceUnitCost ,
OriginalPerPieceCostQuantity ,
OriginalTransFee ,
TransFee ,
CostTrans ,
CostLabor ,
OriginalCostQuantity ,
OriginalFacilityFees ,
FacilityFees ,
Region ,
HashValue ,
CreateDate
FROM dbo.FactInvoiceWasteManifests
WHERE Region = CASE
WHEN ' + @ConnectionStringID + '=1 THEN ''''''''+CAST(''NE'' AS NVARCHAR(25))+''''''''
WHEN ' + @ConnectionStringID + '=2 THEN ''''''''+CAST(''BALT'' AS NVARCHAR(25))+''''''''
WHEN ' + @ConnectionStringID + '=3 THEN ''''''''+CAST(''NY'' AS NVARCHAR(25))+''''''''
WHEN ' + @ConnectionStringID + '=4 THEN ''''''''+CAST(''PA'' AS NVARCHAR(25))+''''''''
END'
--print (@Sql)
原来我没有完全理解 Lookup Transformation 的工作原理。我今天早上解决了我的问题,方法是还使用 ID
列作为连接而不是缓存它。
我正在使用查找转换回顾我的数据仓库 table 以查找从生产中删除的任何记录,然后将它们发送到临时 table 以便从数据仓库中删除 table.
从逻辑上讲,如果记录在生产环境中被删除 table 并且存在于数据仓库中 table 此查找应该找到它并将其重定向到 No Match Output
正确吗?
问题是查找没有找到不匹配的记录,或者我正在做一些倒退的事情。
我应该补充一点,在生产环境中,四个不同的区域有 4 个相同的数据库。我的包通过遍历配置文件中的连接字符串来遍历每个包。然后所有这些记录都用它们来自哪个数据库标记并添加到数据仓库table.
这是我的数据流任务中无法正常工作的部分:
在 "Fact Table" OLE DB 源中,我从我的事实 table 中提取记录,其中 Region
等于连接字符串使用数字 1 - 4 标识的区域。我将查询放在一个变量中,以便它可以是动态的。我也只在暂存 table 中提取不能为空的列,以尽量减少我提取的数量,我只 真的 需要 ID 和 Region 列删除记录,因为它们在各自的区域内应该是唯一的。
内部FindDeletes
变量:
"SELECT ID ,
ParentItemID ,
IsTransPerPiece ,
PerPieceCostQuantity ,
PerPieceCost ,
PerPieceUnitCost ,
OriginalPerPieceCostQuantity ,
OriginalTransFee ,
TransFee ,
CostTrans ,
CostLabor ,
OriginalCostQuantity ,
OriginalFacilityFees ,
FacilityFees ,
Region ,
HashValue ,
CreateDate
FROM dbo.FactInvoiceWasteManifests
WHERE Region = CASE " + (DT_WSTR, 2) @[User::ConnectionStringID] +
" WHEN 1 THEN 'NE'
WHEN 2 THEN 'BALT'
WHEN 3 THEN 'NY'
WHEN 4 THEN 'PA'
END "
内部 OLE DB 源显示变量查询:
接下来我们进行转换,我将不匹配的行重定向到 No Match Output
这里连接到生产环境,这里的查询也是动态的,因为 Region
列在生产环境中不存在。
显示查找 SQL 查询的表达式:
"SELECT ID,
CASE " + (DT_WSTR, 2) @[User::ConnectionStringID] +
" WHEN 1 THEN CAST('NE' AS NVARCHAR(25))
WHEN 2 THEN CAST('BALT' AS NVARCHAR(25))
WHEN 3 THEN CAST('NY' AS NVARCHAR(25))
WHEN 4 THEN CAST('PA' AS NVARCHAR(25))
END AS Region
FROM dbo.InvoiceWasteManifests;"
更新查询:
"SELECT ID,
CASE
WHEN " + (DT_WSTR, 2) @[User::ConnectionStringID] + "=1 THEN CAST('NE' AS NVARCHAR(25))
WHEN " + (DT_WSTR, 2) @[User::ConnectionStringID] + "=2 THEN CAST('BALT' AS NVARCHAR(25))
WHEN " + (DT_WSTR, 2) @[User::ConnectionStringID] + "=3 THEN CAST('NY' AS NVARCHAR(25))
WHEN " + (DT_WSTR, 2) @[User::ConnectionStringID] + "=4 THEN CAST('PA' AS NVARCHAR(25))
END AS Region
FROM dbo.InvoiceWasteManifests;"
最后,我加入了 Region
上的两个 table,然后搜索 ID。结果是没有任何反应,也没有任何记录被重定向到任何地方。
这是您需要输入的第一个动态查询:
--declare @sql varchar(max)
--declare @ConnectionStringID varchar(50) =1
set @sql =
'SELECT ID ,
ParentItemID ,
IsTransPerPiece ,
PerPieceCostQuantity ,
PerPieceCost ,
PerPieceUnitCost ,
OriginalPerPieceCostQuantity ,
OriginalTransFee ,
TransFee ,
CostTrans ,
CostLabor ,
OriginalCostQuantity ,
OriginalFacilityFees ,
FacilityFees ,
Region ,
HashValue ,
CreateDate
FROM dbo.FactInvoiceWasteManifests
WHERE Region = CASE
WHEN ' + @ConnectionStringID + '=1 THEN ''''''''+CAST(''NE'' AS NVARCHAR(25))+''''''''
WHEN ' + @ConnectionStringID + '=2 THEN ''''''''+CAST(''BALT'' AS NVARCHAR(25))+''''''''
WHEN ' + @ConnectionStringID + '=3 THEN ''''''''+CAST(''NY'' AS NVARCHAR(25))+''''''''
WHEN ' + @ConnectionStringID + '=4 THEN ''''''''+CAST(''PA'' AS NVARCHAR(25))+''''''''
END'
--print (@Sql)
原来我没有完全理解 Lookup Transformation 的工作原理。我今天早上解决了我的问题,方法是还使用 ID
列作为连接而不是缓存它。