再加100分求教 SQL Server中非法字符的处理?
请问SQL Server中如何将非法字符检测出来处理掉,或者如何在ADO Dataset的SaveToFile生成的xml中自动除去这些无效字符?比如包含ASCII码值为0x1C、0x0C……等的数据,例如'4'4后面就有一个0x1C,不是空格!
相关贴http://community.csdn.net/Expert/topic/3337/3337248.xml?temp=.2155878
问题点数:100、回复次数:23Top
1 楼pbsql(风云)回复于 2004-09-04 17:30:25 得分 50
你所说的非法字符是怎么定义的?Top
2 楼adevil23(adevil)回复于 2004-09-04 17:31:40 得分 0
'4'Top
3 楼zjcxc(邹建)回复于 2004-09-04 17:35:24 得分 50
replace(字段,N'4','')Top
4 楼pbsql(风云)回复于 2004-09-04 17:36:29 得分 0
你是不是要将键盘无法输入的字符去掉?Top
5 楼zjcxc(邹建)回复于 2004-09-04 17:36:47 得分 0
关键是非法字符的判断规则,如果你无法确定这个规则,则无法做处理.Top
6 楼adevil23(adevil)回复于 2004-09-04 17:41:18 得分 0
包含ASCII码值为0x1C、0x0C……等的数据,主要是一些制表符等等
可以把这个本网页的xml文件存下来,用UltraEdit打开,就会发现这个ASCII码值了Top
7 楼adevil23(adevil)回复于 2004-09-04 17:44:44 得分 0
To:pbsql(风云)
可以按去掉键盘无法输入的字符来处理
To:zjcxc(邹建)
这些数据为什么能存进SQL Server,能否在源头做控制,即不让这些字符进库
Top
8 楼zjcxc(邹建)回复于 2004-09-04 17:48:28 得分 0
源头控制当然可以啦,这个应该是你程序没有写好而已.
不知道你用什么程序来处理的.Top
9 楼zjcxc(邹建)回复于 2004-09-04 17:49:14 得分 0
另外,我曾经见过PB处理的,会把编码为0的也存进数据库,所以你应该仔细检查一下你的处理程序.Top
10 楼adevil23(adevil)回复于 2004-09-04 17:52:22 得分 0
前台用的delphi
这些数据不是输入进去的,是用DTS导入的
现在要去掉键盘无法输入的字符怎么处理?Top
11 楼pbsql(风云)回复于 2004-09-04 17:55:27 得分 0
可以按去掉键盘无法输入的字符来处理
那就是去掉asc码值小于32的字符就行了Top
12 楼pbsql(风云)回复于 2004-09-04 17:57:06 得分 0
写个函数把asc码值小于32的字符过滤掉即可Top
13 楼adevil23(adevil)回复于 2004-09-04 18:00:30 得分 0
To pbsql(风云)
1、怎么去?
2、小于32包括回车、换行等,这些数据可不能去啊
To zjcxc(邹建)
你说的前台控制怎么控制?是DataSet Post时控制?Top
14 楼pbsql(风云)回复于 2004-09-04 18:04:26 得分 0
那就保留#10、#13
你最好看一下你的程序,防止这样的事情发生Top
15 楼zjcxc(邹建)回复于 2004-09-04 18:09:13 得分 0
--处理的示例函数
create function f_replace(
@str varchar(8000)
)returns varchar(8000)
as
begin
select @str=replace(@str,a,'')
from(select a=N''
union all select N''
union all select N''
union all select N''
union all select N''
union all select N''
union all select N''
union all select N''
union all select N' '
union all select N'
'
union all select N''
union all select N''
union all select N'
'
union all select N''
union all select N''
union all select N''
union all select N''
union all select N''
union all select N''
union all select N''
union all select N''
union all select N''
union all select N''
union all select N''
union all select N''
union all select N''
union all select N''
union all select N''
union all select N''
union all select N''
union all select N''
)a where charindex(a,@str)>0
return(@str)
end
go
--调用函数进行替换处理的示例
declare @s varchar(10)
set @s='a '+'b'+char(11)+'c'
select dbo.f_replace(@s)
go
drop function f_replace
Top
16 楼adevil23(adevil)回复于 2004-09-04 18:10:06 得分 0
那对于库里已经存在的数据,去掉这些字符的函数如何写?Top
17 楼zjcxc(邹建)回复于 2004-09-04 18:10:47 得分 0
--自定义函数中用到的字符列表的生成方法:
declare @t table(id int identity,a int)
set rowcount 31
insert @t select 1 from syscolumns
select 'union all select N'''+char(id)+''''
from @tTop
18 楼zjcxc(邹建)回复于 2004-09-04 18:11:57 得分 0
对于不需要去掉的字符,比回车13,换行10,跳格键9,你只需要删除函数中对应的行就行了.Top
19 楼zjcxc(邹建)回复于 2004-09-04 18:12:27 得分 0
--更新表中的数据,当然就是:
update 表 set 字段=dbo.f_replace(字段)Top
20 楼zjcxc(邹建)回复于 2004-09-04 18:14:02 得分 0
至于我说的前台的问题.
是指你的处理程序,你首先应该分析产生此问题的根源
用DTS导入,如果你的导入源文件中没有非法字符,应该是不会产生这种问题的.Top
21 楼adevil23(adevil)回复于 2004-09-04 18:33:08 得分 0
有没有可能是SubString的问题?Top
22 楼zjcxc(邹建)回复于 2004-09-04 20:23:29 得分 0
substring应该不会,除非是对 text、image、binary 或 varbinary 这些类型的字段用substring,这样可能会取半个汉字,形成乱码.Top
23 楼zjcxc(邹建)回复于 2004-09-05 13:55:18 得分 0
--整理一下
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[f_replace]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[f_replace]
GO
/*--非法字符替换函数
去掉字符串中,小于32的字符
保留 TAB char(9)
换行 char(10)
回车 char(13)
--邹建 2004.09(引用请保留此信息)--*/
/*--调用示例
--调用函数进行替换处理的示例
declare @s varchar(10)
set @s='a '+'b'+char(11)+'c'
select dbo.f_replace(@s)
--*/
create function f_replace(
@str varchar(8000)
)returns varchar(8000)
as
begin
select @str=replace(@str,a,'')
from(select a=N''
union all select N'' union all select N''
union all select N'' union all select N''
union all select N'' union all select N''
union all select N''
-- union all select N' ' --TAB char(9)
-- union all select N'
-- ' --换行 char(10)
union all select N'' union all select N''
-- union all select N'
-- ' --回车 char(13)
union all select N'' union all select N''
union all select N'' union all select N''
union all select N'' union all select N''
union all select N'' union all select N''
union all select N'' union all select N''
union all select N'' union all select N''
union all select N'' union all select N''
union all select N'' union all select N''
union all select N'' union all select N''
)a where charindex(a,@str)>0
return(@str)
end
go
Top




