好的,我有一个DbaseIV格式的数据库,在Codepage IBM-850中有数据,我需要导入到SQL Server 2008.我使用asp脚本导入数据,最近我发现存储特殊字符的问题字符串。
目前这个字段是varchar ...在网页的响应中一切都很好但是当我尝试查看数据库中的数据时,这些特殊字符会被替换或以其他方式解释。
我在SQL查询中使用参数化值来存储我需要将数据从Codepage 850(IBM-850)转换为1252(Windows-1252)或65001(UTF-8)的数据。
104 31 Yaxcabß NULL
这必须是
104 31 Yaxcabá NULL
这是asp源
function ImportarEntidadfed(oFileName,oDBFConn)
Dim sSQL, RSImport, oSysConn, aIData, cont
dim keys(1), bNewData, iUpdate(1), iInsert(1), itmp
Dim oCmd
dim afile
dim sResult
sSQL = "SELECT entidad,nom_ent,mun,nom_mun,loc,nom_loc,longitud,latitud FROM " & oFileName & " ORDER BY entidad,mun,loc;"
Set oRs = oDBFConn.execute(sSQL)
Set oSysConn = Server.CreateObject("ADODB.Connection")
oSysConn.ConnectionString=strcon
aIData= oRs.GetRows()
keys(0)=""
keys(1)=""
iUpdate(0)=0
iInsert(0)=0
iUpdate(1)=0
iInsert(1)=0
For cont = 0 to Ubound(aIData,2)
if keys(0) <> aIData(0,cont) And aIData(0,cont) <> "00" Then 'Entidad federativa
sResult = aIData(1,cont)
oSysConn.open
sSQL = "SELECT * FROM yyyyyy WHERE cve_entfed= ? ;"
'-------------------------------------------------------------------
Set oCmd = Server.CreateObject("ADODB.Command")
oCmd.CommandText = sSQL
set oCmd.ActiveConnection= oSysConn
Set oPar = oCmd.CreateParameter("cve_entfed",129,1,2,aIData(0,cont)) ' Char(2)
oCmd.Parameters.Append(oPar)
'-------------------------------------------------------------------
Set oRs=oCmd.Execute()
'Set oRs=oSysConn.execute(sSQL)
bNewData = oRs.EOF
'oSysConn.Close
if bNewData Then
sSQL = "INSERT INTO yyyyyy (descripcion,cve_entfed) VALUES ( ? , ? );"
Else
sSQL = "UPDATE yyyyyy SET descripcion= ? WHERE cve_entfed= ? ;"
End if
'-------------------------------------------------------------------
Set oCmd = Server.CreateObject("ADODB.Command")
oCmd.CommandText = sSQL
set oCmd.ActiveConnection= oSysConn
Set oPar = oCmd.CreateParameter("descripcion",200,1,255,aIData(1,cont)) 'StringSane(aIData(1,cont)) varchar(max)
oCmd.Parameters.Append(oPar)
Set oPar = oCmd.CreateParameter("cve_entfed",129,1,2,aIData(0,cont)) ' Char(2)
oCmd.Parameters.Append(oPar)
'-------------------------------------------------------------------
'oSysConn.open
'call oSysConn.execute(sSQL,itmp)
Set oRs=oCmd.Execute(itmp)
oSysConn.Close
if bNewData Then
sResult = sResult & " [INS] "
else
sResult = sResult & " [ACT] "
End if
keys(0) = aIData(0,cont)
end if
Next
Set oSysConn = nothing
ImportarEntidadfed = sResult & " (Municipios " & Cstr(iUpdate(0)) & "[ACT] " & Cstr(iInsert(0)) & "[INS]) (Localidades " & Cstr(iUpdate(1)) & "[ACT] " & CStr(iInsert(1)) & "[INS])"
end function
sub Import()
Dim oDBFConn
Dim oDir, oFs, oFiles, oFile
Dim sResult
Set oDBFConn = Server.CreateObject ("ADODB.Connection")
Set oFS = Server.CreateObject("Scripting.FileSystemObject")
Set oDir = oFs.GetFolder(Server.MapPath(".\import\") & "\")
'response.write(Server.MapPath(".\import\"))
sResult = ""
Set oFiles = oDir.Files
oDBFConn.open sDBFConn
For Each oFile in oFiles
aFile=Split(oFile.ShortName,".",-1,1)
if Ubound(aFile) = 1 Then
if Ucase(aFile(1)) = "DBF" Then
sResult = sResult & oFile.name & ":" & ImportarEntidadfed(Cstr(oFile.ShortName),oDBFConn) & "<br/>"
end if
end if
Next
oDBFConn.Close
response.write(sResult)
Set oDBFConn = nothing
Set oFS = nothing
Set oDir = nothing
End sub
Call Import()
想一想这个问题,我记得SQL服务器本身有一个转换代码页COLLATE
的选项,我发现可能是符合我需要的排序SQL_1Xcompat_CP850_CI_AS
,但我不知道如何在插入/更新中使用它,如果至少可以使用它。
答案 0 :(得分:0)
如果我理解你是正确的,你想要更改列和数据库的排序规则。
如果是这样,您必须先更改数据库的排序规则,这样如果添加新列,则这些排序也将采用相同的排序规则。
此sql检查数据库的当前排序规则
SELECT DATABASEPROPERTYEX('YourDatabase', 'Collation') SQLCollation;
然后更改数据库排序规则使用此语句
ALTER DATABASE YourDatabase
COLLATE French_CI_AI ;
然后您必须更改列的排序规则。使用此语句可以查看列的排序规则
SELECT name, collation_name
FROM sys.columns
WHERE OBJECT_ID IN ( SELECT OBJECT_ID
FROM sys.objects
WHERE type = 'U'
AND name = 'YourTable')
然后要更改列排序规则,您可以使用此声明
ALTER TABLE TestTable
ALTER COLUMN FirstCol VARCHAR(10)
COLLATE SQL_Latin1_General_CP1_CS_AS NULL
我希望这会有所帮助