Chuyển dữ liệu từ VNI sang Unicode cho SQL Server

Cơ sở dữ liệu SQL Server của bạn rất lớn và cần chuyển toàn bộ dữ liệu từ font VNI sang Unicode. Đây là một công việc khó khăn tưởng chừng không giải quyết được.

Bạn hãy thực hiện theo các bước sau đây:

1. Chuyển field  liên quan sang kiểu nchar

2. Tạo 1 file Access project (.adp). Chạy File / Connection để connect nó vào SQLServer và database. Nhập vào user và password của SQL. Các table trong database sẽ hiện lên trong Access.

3. Tạo mới 1 module. Vào Tools/ Reference và check vào Microsoft ActiveX Data ObjectLibrary 2.x

4. Copy 2 function này vào module

Function VniToUni(str$) AsString
Dim VNI$, UNI$, i&, sUni$, arrUNI() As String
VNI = “aù,aø,aû,aõ,aï,aâ,aê,aá,aà,aå,aã,aä,aé,aè,aú,aü,aë,AÙ,AØ,AÛ,AÕ,AÏ,AÂ,AÊ,AÁ,AÀ,AÅ,AÃ,AÄ,AÉ,AÈ,AÚ,AÜ,AË,eù,eø,eû,eõ,eï,eâ,eá,eà,eå,eã,eä,EÙ,EØ,EÛ,EÕ,EÏ,EÂ,EÁ,EÀ,EÅ,EÃ,EÄ,í,ì ,æ ,ó ,ò ,Í ,Ì ,Æ ,Ó ,Ò ,où,oø,oû,oõ,oï,oâ,ô,oá,oà,oå,oã,oä,ôù,ôø,ôû,ôõ,ôï,OÙ,OØ,OÛ,OÕ,OÏ,OÂ,Ô,OÁ,OÀ,OÅ,OÃ,OÄ,ÔÙ,ÔØ,ÔÛ,ÔÕ,ÔÏ,uù,uø,uû,uõ,uï,ö,öù,öø,öû,öõ,öï,UÙ,UØ,UÛ,UÕ,UÏ,Ö ,ÖÙ,ÖØ,ÖÛ,ÖÕ,ÖÏ,yù,yø,yû,yõ,î ,YÙ,YØ,YÛ,YÕ,Î,ñ ,Ñ ”
UNI =”E1,E0,1EA3,E3,1EA1,E2,103,1EA5,1EA7,1EA9,1EAB,1EAD,1EAF,1EB1,1EB3,1EB5,1EB7,C1,C0,1EA2,C3,1EA0,C2,102,1EA4,1EA6,1EA8,1EAA,1EAC,1EAE,1EB0,1EB2,1EB4,1EB6,E9,E8,1EBB,1EBD,1EB9,EA,1EBF,1EC1,1EC3,1EC5,1EC7,C9,C8,1EBA,1EBC,1EB8,CA,1EBE,1EC0,1EC2,1EC4,1EC6,ED,EC,1EC9,129,1ECB,CD,CC,1EC8,128,1ECA,F3,F2,1ECF,F5,1ECD,F4,1A1,1ED1,1ED3,1ED5,1ED7,1ED9,1EDB,1EDD,1EDF,1EE1,1EE3,D3,D2,1ECE,D5,1ECC,D4,1A0,1ED0,1ED2,1ED4,1ED6,1ED8,1EDA,1EDC,1EDE,1EE0,1EE2,FA,F9,1EE7,169,1EE5,1B0,1EE9,1EEB,1EED,1EEF,1EF1,DA,D9,1EE6,168,1EE4,1AF,1EE8,1EEA,1EEC,1EEE,1EF0,FD,1EF3,1EF7,1EF9,1EF5,DD,1EF2,1EF6,1EF8,1EF4,111,110″
arrUNI = Split(UNI, “,”)
For i = 1 To Len(str)
If InStr(1, VNI, Mid(str, i, 2), vbBinaryCompare) > 0 And Len(Mid(str, i,2)) = 2 Then
sUni = sUni & ChrW(“&h” & arrUNI(InStr(VNI, Mid(str, i,2)) \ 3))
i = i + 1
ElseIf InStr(1, VNI, Mid(str, i, 1) & ” “, vbBinaryCompare) >0 Then
sUni = sUni & ChrW(“&h” & arrUNI(InStr(VNI, Mid(str, i,1) & ” “) \ 3))
End If
If InStr(1, VNI, Mid(str, i, 1), vbBinaryCompare) = 0 Or InStr(1,”a,A,e,E,o,O,u,U,y,Y, “, Mid(str, i, 1), vbBinaryCompare) > 0 ThensUni = sUni & Mid(str, i, 1)
Next
VniToUni = sUni
End Function

Function ConvertTableVNItoUNI(TableName,FieldName)
‘On Error Resume Next
Dim rst As New ADODB.Recordset
rst.Open “select ” & FieldName & ” from ” &TableName, CurrentProject.Connection, adOpenDynamic, adLockOptimistic

Do While Not rst.EOF
If Not IsNull(rst(0)) Then

rst(0) = VniToUni(rst(0))
End If
rst.Update
rst.MoveNext
Loop
End Function

Vẫn trong module chọn View / Immediate Windows
Nhập vào lệnh ConvertTableVNItoUNI “TÊN_TABLE”,”TÊN_FIELD”.  Nhấn Enter. Field sẽ được chuyển từ VNI sang Unicode.

Cách này là tối ưu vì độ dài của các ký tự tiếng Việt trong VNI là không cố định nên phải có array mới làm được, mà trong SQL Stored Procedure thì không hỗ trợ array.

Phương pháp trên đã được kiểm nghiệm trong thực tế. Với số lượng record khoảng 300,000 dòng chạy không quá 8 giây.

Các bạn có trục trặc trong việc thực hiện xin email trực tiếptới support@tavicosoft.com để được hỗ trợ. Subject xin ghi “SQL Server conversion from VNI to Unicode”.

(Nguồn: Ta Vi Co Ltd.)

Comments

comments

Hỗ trợ trực tuyến