【问题标题】:Using Chinese characters in SQL Server stored procedure在 SQL Server 存储过程中使用汉字
【发布时间】:2017-08-14 19:51:16
【问题描述】:

我有一个由 SSIS 包调用的存储过程。这个包调用了许多存储过程,但这个特定的一个是唯一引起问题的。基本上,我将表中的列从nchar 转换为nvarchar 并将这些值放入另一个表中。

值可以是英文,也可以是中文。

代码如下:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[TransformCustomer]
AS
    DECLARE @MapDimCustomer TABLE
                            (
                                 SourceSystemId INT,
                                 ExCustomerKey NVARCHAR(15),
                                 CustomerName NVARCHAR(115),
                                 CustomerTypeName NVARCHAR(50)
                            )

    INSERT INTO @MapDimCustomer (SourceSystemId, ExCustomerKey, CustomerName, CustomerTypeName)
        SELECT
            4 As SourceSystemId,
            c.ABAN8 As ExCustomerKey,
            c.ABALPH As CustomerName,
            c.ABAT1 As CustomerTypeName
        FROM
            F0101 c
        LEFT JOIN
            GlobalDW.stage.DimCustomer gc ON c.ABAN8 = gc.ExCustomerKey 
                                          AND gc.SourceSystemID = 4
         WHERE
             gc.CustomerID IS NULL;

    SELECT * FROM @MapDimCustomer;

所以,它说的地方

DECLARE @MapDimCustomer TABLE
(
  SourceSystemId int,
  ExCustomerKey nvarchar(15),
  CustomerName nvarchar(115),
  CustomerTypeName nvarchar(50)
)

INSERT INTO @MapDimCustomer(SourceSystemId, ExCustomerKey, CustomerName, CustomerTypeName)

CustomerName 可以是英文或中文。当我运行它时,它会将中文符号变成?????。我知道,如果我输入客户名称,我将不得不使用N'Chinese Characters here'。有没有办法声明?

【问题讨论】:

  • 我怀疑F0101.CustomerName中的数据类型是varchar?这意味着该表中的数据已经删除了汉字并替换为?因为 varchar 不支持这些字符。没有任何级别的转换或任何可以恢复这些字符的方法......它们已经消失了。
  • 不,F0101中的数据是nchar。
  • 所以如果你只运行上面插入的 select 语句部分,你会看到中文字符吗?
  • 是的,没错。
  • 好的,我再次运行了该程序,它成功了。删除此问题。

标签: sql sql-server stored-procedures ssis


【解决方案1】:

作为您关于查看第一个字符以确定 UNICODE 值的问题的答案,它会是这样的。

SELECT 4 As SourceSystemId
    , c.ABAN8 As ExCustomerKey
    , case when UNICODE(left(c.ABALPH, 1)) > 127 then c.ABALPH else c.ABDC end As CustomerName
    , c.ABAT1 As CustomerTypeName
FROM F0101 c
LEFT JOIN GlobalDW.stage.DimCustomer gc ON c.ABAN8 = gc.ExCustomerKey 
                                    AND gc.SourceSystemID = 4
WHERE gc.CustomerID IS NULL;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-03
    相关资源
    最近更新 更多