我在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
答案 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