出于某种原因,SSIS Lookup转换似乎是在检查缓存中是否有NCHAR(128)值而不是NVARCHAR(128)值。这导致查找的值上有大量附加的空格,导致查找无法找到匹配项。
在Lookup转换中,我将其配置为No Cache,以便它始终进入数据库,以便我可以使用SQL事件探查器进行跟踪并查看它正在查找的内容。这是它捕获的内容(注意在第二行最后一行的单引号处结束的空格 - 需要水平滚动):
exec sp_executesql N'
select *
from (
SELECT SurrogateKey, NaturalKey, SomeInt
FROM Dim_SomeDimensionTable
) [refTable]
where [refTable].[NaturalKey] = @P1
and [refTable].[SomeInt] = @P2'
,N'@P1 nchar(128)
,@P2 smallint'
,N'VALUE '
,8
这是目标表的架构:
CREATE TABLE [dbo].[dim_SomeDimensionTable] (
[SurrogateKey] [int] IDENTITY(1,1) NOT NULL,
[NaturalKey] [nvarchar](128) NOT NULL,
[SomeInt] [smallint] NOT NULL
)
我想弄清楚为什么SSIS将NaturalKey值检查为NCHAR(128)以及如何在不使用空格的情况下将其作为NVARCHAR(128)执行查找。
我尝试过的事情:
任何想法都将不胜感激!
答案 0 :(得分:1)
它没有任何区别。
您需要在其他地方寻找问题的根源(例如,列可能具有区分大小写的排序规则)。
在LIKE
比较中,尾随空格仅对SQL Server有意义,而不是=
比较as documented here。
SQL Server遵循ANSI / ISO SQL-92规范(第8.2节, ,关于如何比较字符串的一般规则#3) 有空格。 ANSI标准要求填充字符 比较中使用的字符串,以便它们的长度匹配 比较它们。填充直接影响WHERE的语义 和HAVING子句谓词和其他Transact-SQL字符串 比较。例如,Transact-SQL认为字符串'abc'和 'abc'与大多数比较操作相同。
此规则的唯一例外是LIKE谓词......
您也可以通过运行以下内容轻松查看。
USE tempdb;
CREATE TABLE [dbo].[Dim_SomeDimensionTable] (
[SurrogateKey] [int] IDENTITY(1,1) NOT NULL,
[NaturalKey] [nvarchar](128) NOT NULL,
[SomeInt] [smallint] NOT NULL
)
INSERT INTO [dbo].[Dim_SomeDimensionTable] VALUES ('VALUE',8)
exec sp_executesql N'
select *
from (
SELECT SurrogateKey, NaturalKey, SomeInt
FROM Dim_SomeDimensionTable
) [refTable]
where [refTable].[NaturalKey] = @P1
and [refTable].[SomeInt] = @P2'
,N'@P1 nchar(128)
,@P2 smallint'
,N'VALUE '
,8
返回单行