使用 SSIS 将视图 nvarchar 转换为 varchar 时,获取某些字符串前面"?"字符



我使用SSIS转换和移动SQL Server视图中的数据,该视图由具有大量联接的各种表组成。所有数据最初都来自Sap B1,被拉入我所需的由nvarchar数据组成的表中,然后转换为varchar数据,因为这正是我的目的地所需要的。

我经常将数据直接从SAP提取到SQL Server中,直到最近这一直不是一个问题(我定期提取这些数据和更多数据,没有其他数据给我带来这种麻烦——到目前为止,只有以下几项,我想弄清它的真相,这样我就能理解为什么会发生这种情况(。

SSIS流实际上是这样的(AllQuotes_View(>(数据转换(从nvarchar转换为"nvarchar";字符串[DT_STR]";100长度的代码页(1252 ANSI-拉丁文I(>(所有报价表(

目标表创建代码


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(,当在表上进行选择时,数据显示为'?5HB12A'

请注意,在转换并移动到我的目标表之前,在设计器中查看视图中的数据或在Management studio中使用视图中的select语句时,它没有前导"&";。

有人能解释一下吗?我试过在谷歌上搜索,但这是一个很难用短搜索词表达的话题。

我可以在目标表上运行下面的代码来删除"字符串开头的字符。

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

有人能提出什么建议来找出为什么会突然发生这种情况,或者解决我的问题吗?没有替换代码,因为这看起来像是一个bodge。

感谢您提出的任何修复建议或指南。

为什么会发生这种情况

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

Unicode字符是什么

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

CODEPOINT([column]

CODEPOINT函数用于:

返回字符表达式最左边字符的Unicode代码点。

然后,添加一个数据查看器来检查生成的值。

一旦知道Unicode值,就可以从Unicode表中进行检查

如何移除

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

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

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

SQL SERVER 2017+

TRIM(product_sku)

SQL SERVER 2017的早期版本

LTRIM(RTRIM(product_sku))

最新更新