在SQL Server中识别nvarchar列中的unicode字符

时间:2017-11-10 01:41:10

标签: sql sql-server tsql unicode sql-server-2012

我在SQL Server数据库中有一个名为airports的表,其列声明为nvarchar(255)。我不得不将其声明为nvarchar,否则SSIS无法从API生成的.csv文件中导入数据。

我在这张表中有大约25k条记录,通过运行此查询,我可以告诉763其中包含Unicode字符:

select cast(name as varchar), name 
from airports 
where cast(name as varchar) <> name

第一行显示第1列和第2列中返回的以下两个值

Harrisburg Capital City Airpor  
Harrisburg Capital City Airport

第1列的第一个值已将最后一个值剥离掉,我假设这意味着字符串中有一个unicode字符。如果我错了,请告诉我,因为我对unicode字符有点无用。

我的问题是:如何在列中找到unicode字符,是否有安全/推荐的方法将其删除?

我确实试过这个,看看我是否能找到它,但它并没有做我认为会做的事情。

set nocount on
DECLARE @nstring NVARCHAR(100)
SET @nstring =(select name from airports where fs = 'HAR')
DECLARE @position INT
SET @position = 1

DECLARE @CharList TABLE (Position INT,UnicodeChar NVARCHAR(1),UnicodeValue INT)

WHILE @position <= DATALENGTH(@nstring)
BEGIN
    INSERT @CharList
       SELECT 
           @position as Position,
           CONVERT(nchar(1),SUBSTRING(@nstring, @position, 1)) as UnicodeChar,
           UNICODE(SUBSTRING(@nstring, @position, 1)) as UnicodeValue
    SET @position = @position + 1
END

SELECT * 
FROM @CharList[/sql]
ORDER BY unicodevalue

输出如下

32      NULL
33      NULL
34      NULL
35      NULL
36      NULL
37      NULL
38      NULL
39      NULL
40      NULL
41      NULL
42      NULL
43      NULL
44      NULL
45      NULL
46      NULL
47      NULL
48      NULL
49      NULL
50      NULL
51      NULL
52      NULL
53      NULL
54      NULL
55      NULL
56      NULL
57      NULL
58      NULL
59      NULL
60      NULL
61      NULL
62      NULL
11      32
19      32
24      32
25  A   65
20  C   67
12  C   67
1   H   72
2   a   97
13  a   97
17  a   97
7   b   98
10  g   103
15  i   105
5   i   105
21  i   105
26  i   105
18  l   108
29  o   111
28  p   112
14  p   112
9   r   114
3   r   114
4   r   114
30  r   114
27  r   114
6   s   115
16  t   116
22  t   116
31  t   116
8   u   117
23  y   121

1 个答案:

答案 0 :(得分:0)

但是,如果您想首先找到包含unicode个字符的记录,请在case表达式

的帮助下遵循以下方法
;WITH CTE
 AS (
 SELECT DATA, 
        CASE
            WHEN(CAST(DATA AS VARCHAR(MAX)) COLLATE SQL_Latin1_General_Cp1251_CS_AS) = DATA
            THEN 0
            ELSE 1
        END HasUnicodeChars,
       ROW_NUMBER() OVER (ORDER BY (SELECT 1)) RN
 FROM <table_name>)

SELECT * FROM CTE where HasUnicodeChars = 1