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