得到“?”使用 SSIS 将视图 nvarchar 转换为 varchar 时某些字符串前面的字符

Getting "?" character in front of certain strings when using SSIS to convert view nvarchar to varchar

我正在使用 SSIS 转换和移动 SQL 服务器视图中的数据,该视图由具有大量连接的各种 table 组成。所有数据最初都来自 Sap B1,拉入我需要的 tables,由 nvarchar 数据组成,然后转换为 varchar 数据,因为那是我的目的地需要的。

我经常直接从 SAP 中提取数据到 SQL 服务器,直到最近这才成为问题(我定期提取这个和更多数据,到目前为止没有其他数据给我带来这个麻烦只有以下并想深入了解它,以便我能理解它发生的原因)。

SSIS Flow 字面意思是这样的 (AllQuotes_View) > (Data Conversion) converting from nvarchar to "String [DT_STR]" 100 长度,codepage (1252 ANSI - Latin I) 为有问题的列" > (AllQuotes_Table)

目的地table创建代码


SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[AllQuotes_Table]
(
    [quote_no] [int] NULL,
    [quote_prepared_for] [varchar](50) NULL,
    [quote_customer] [varchar](100) NULL,
    [quote_ref] [varchar](100) NULL,
    [quote_prepared_by] [varchar](155) NULL,
    [quote_date] [varchar](30) NULL,
    [quote_currency] [varchar](30) NULL,
    [quote_currency_letters] [varchar](50) NULL,
    [quote_total] [numeric](20, 2) NULL,
    [product_qty] [numeric](20, 0) NULL,
    [product_sku] [varchar](50) NULL,
    [product_description] [varchar](250) NULL,
    [product_stock] [varchar](100) NULL,
    [product_unit] [numeric](21, 6) NULL,
    [product_total] [numeric](38, 7) NULL,
    [LineNum] [int] NULL,
    [Address] [varchar](500) NULL,
    [U_EmailCont1] [varchar](250) NULL
) ON [PRIMARY]
GO

这在过去已经成功地工作了一年多,但最近,product_sku 列中的一些数据有一个“?”添加在预期字符串的前面。例如。当通过上面显示的数据转换将包含 product_sku ' 5HB12A' 的行从 (AllQuotes_View) 移动到 (AllQuotes_Table) 数据时,在 select 上执行 select table 显示为“?5HB12A”

在转换和移动到我的目的地之前,在设计器的视图中查看数据或使用管理工作室视图中的 select 语句时要注意 table 它没有前导“?”。

任何人都可以对此有所了解吗,我已经尝试过谷歌搜索,但很难用简短的搜索词来表达。

我可以 运行 目标下方的代码 table 删除“?”字符串开头的字符。

UPDATE AllQuotes_Table 
SET product_sku = RIGHT(product_sku, LEN(product_sku) - 1) 
WHERE product_sku LIKE '?%';

但是,这是一个快速修复,并没有触及问题的根源,我想找出为什么会发生这种情况。

我在所有列上都有 运行 个 select 以查看是否相同的“?”正在添加到任何其他列,但它没有。

这 运行 成功地超过了 1000 个引号,product_sku 是唯一似乎受到影响的列,到目前为止唯一发生这种情况的数据是以下字符串

?RDR-80582AKU
?4ZB97A#B19
?5HB12A
?EG-2000 IT
?EG-2000-01

任何人都可以提出任何建议来尝试找出为什么突然发生这种情况或解决我的问题吗?没有替换代码,因为这看起来很麻烦。

感谢您提供任何修复建议或任何地方的指南。

这意味着原始 product_sku 中出现了一些无法打印的字符,无法转换为 VARCHAR 数据类型。作为数据拉取的一部分,我建议您执行以下操作。

SQL 服务器 2017+

TRIM(product_sku)

SQL SERVER 2017 的早期版本

LTRIM(RTRIM(product_sku))

为什么会这样?

如您所述,您正在将数据从 Unicode 列 (nvarchar) 导入到 non-Unicode 列 (varchar)。添加 ? 是因为存在无法转换为 1252 ANSI - Latin I 代码页的 Unicode 字符。

什么是 Unicode 字符?

要检查此字符,请临时添加具有以下表达式的派生列:

CODEPOINT([column]

CODEPOINT函数用于:

Returns the Unicode code point of the leftmost character of a character expression.

然后,add a data viewer to check the values generated.

一旦知道了 Unicode 值,就可以从 Unicode Table

中查看它

如何删除它?

要从字符串值的开头删除该字符,可以使用以下派生列表达式(假设Unicode字符代码为10):

CODEPOINT([column]) == 10 ? SUBSTRING([column],2,LEN([column]) - 1) : [column]