Sql server SSIS查找转换,包括空格

Sql server SSIS查找转换,包括空格,sql-server,ssis,type-conversion,sqldatatypes,Sql Server,Ssis,Type Conversion,Sqldatatypes,出于某种原因,SSIS查找转换似乎正在检查缓存中的NCHAR(128)值,而不是NVARCHAR(128)值。这将导致在所查找的值上附加一大堆空白,并导致查找无法找到匹配项 在查找转换中,我将其配置为没有缓存,以便它始终进入数据库,这样我就可以使用SQL Profiler进行跟踪,并查看它在查找什么。这就是它捕获的内容(请注意,最后一行中以单引号结尾的空格-需要水平滚动): 以下是目标表的架构: CREATE TABLE [dbo].[dim_SomeDimensionTable] ( [Sur

出于某种原因,SSIS查找转换似乎正在检查缓存中的NCHAR(128)值,而不是NVARCHAR(128)值。这将导致在所查找的值上附加一大堆空白,并导致查找无法找到匹配项

在查找转换中,我将其配置为没有缓存,以便它始终进入数据库,这样我就可以使用SQL Profiler进行跟踪,并查看它在查找什么。这就是它捕获的内容(请注意,最后一行中以单引号结尾的空格-需要水平滚动):

以下是目标表的架构:

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)的形式执行查找

我尝试过的事情:

  • 我在SQL Server源查询中使用了LTRIM()和RTRIM()
  • 在查找之前,我使用了一个派生列转换来添加一个具有原始值TRIM()'d的新列(这个经过修剪的列就是我传递给查找转换的列)
  • 在查找之前和之后,我对行进行了多播,并将它们发送到unicode平面文件目标,在这两种情况下都没有空格
  • 在查找之前,我查看了数据流路径上的元数据,它将值显示为具有长度为128的数据类型DT_WSTR

任何想法都将不胜感激

这没什么区别

您需要在其他地方查找问题的根源(例如,该列可能具有区分大小写的排序规则)

尾随空格仅对SQL Server在
比较(如
比较)中有效,而不是
=
比较

SQL Server遵循ANSI/ISO SQL-92规范(第8.2节, ,关于如何比较字符串的一般规则#3) 有空格。ANSI标准要求字符填充 用于比较的字符串,以便它们的长度在比较之前匹配 比较它们。填充直接影响WHERE的语义 并具有子句谓词和其他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
它返回单个行

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