SQL 生成签名函数算法

A:

if object_id('dbo.fn_SQLSigTSQL') is not null
drop function dbo.fn_SQLSigTSQL;
GO
create function dbo.fn_SQLSigTSQL(@p1 ntext,@parselength int =4000)
returns nvarchar(4000)
as
begin
declare @maxlength as int;
declare @mode as char(10);
declare @p2 as nchar(4000);
declare @pos as int;
declare @currchar as char(1),@nextchar as char(1);
declare @p2len as int;
set @maxlength=len(rtrim(substring(@p1,1,4000)));
set @maxlength= case when @parselength>@maxlength then  @maxlength else @parselength end;
set @pos=1;
set @p2='';
set @p2len=0;
set @currchar='';
set @nextchar='';
set @mode='command';
while(@pos<=@maxlength)
begin
set @currchar=substring(@p1,@pos,1);
set @nextchar=substring(@p1,@pos+1,1);
if @mode='command'
begin
set @p2=left(@p2,@p2len)+@currchar;
set @p2len=@p2len+1;
if @currchar in(',','(',' ','=','<','>','!') and @nextchar between '0' and '9'
begin
set @mode='mumber';
set @p2=left(@p2,@P2len)+'#';
set @p2len=@p2len+1;
end
if @currchar=''''
begin
set @mode='literal';
set @p2=left(@p2,@p2len)+'#''';
set @p2len=@p2len+2;
end
end
else if @mode='mumber' and @nextchar in(',',')',' ','=','<','>','!')
set @mode='command';
else if @mode='literal' and @currchar=''''
set @mode='command';
set @pos=@pos+1;
end
return @p2;
end
GO

B:测试代码

select dbo.fn_SQLSigTSQL(N'select * from dbo.T1 where col=3 and col2>78',4000);

生成结果:

select * from dbo.T1 where col=# and col2>#                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值