SSIS查找转换包括空格

时间:2014-03-21 18:45:36

标签: sql-server ssis type-conversion sqldatatypes

出于某种原因,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)执行查找。

我尝试过的事情:

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

任何想法都将不胜感激!

1 个答案:

答案 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

返回单行