去年无聊的时候想到想玩一下根据ASCII表的排列顺序将字符串内的数值往前或者后移N个位,顺便看一下是T-SQL性能好还是用C#写CLR函数处理得快。结果是在50万行以下其实两者差距很小,当然这是在我的笔记本上测试的结果(I5双核四线程+8G内存+5600转的机械硬盘)。在100万行以上的时候用T-SQL基于集合的方式就体现出优势了,用了大概1分多钟就处理完100万行,而CLR用了4分多钟还没处理完。这里贴上当时的T-SQL代码。

if OBJECT_ID('tempdb..#tt') is not null
drop table #tt if OBJECT_ID('tempdb..#t') is not null
drop table #t if OBJECT_ID('tempdb..#ttt') is not null
drop table #ttt if OBJECT_ID('tempdb..#tttt') is not null
drop table #tttt select dbo.tblNumbers.id, abs(CHECKSUM(NEWID()))%62 as fld1,
abs(CHECKSUM(NEWID()))%62 as fld2,
abs(CHECKSUM(NEWID()))%62 as fld3,
abs(CHECKSUM(NEWID()))%62 as fld4,
abs(CHECKSUM(NEWID()))%62 as fld5,
abs(CHECKSUM(NEWID()))%62 as fld6,
abs(CHECKSUM(NEWID()))%62 as fld7,
abs(CHECKSUM(NEWID()))%62 as fld8,
abs(CHECKSUM(NEWID()))%62 as fld9,
abs(CHECKSUM(NEWID()))%62 as fld10,
abs(CHECKSUM(NEWID()))%62 as fld11,
abs(CHECKSUM(NEWID()))%62 as fld12,
abs(CHECKSUM(NEWID()))%62 as fld13,
abs(CHECKSUM(NEWID()))%62 as fld14,
abs(CHECKSUM(NEWID()))%62 as fld15,
abs(CHECKSUM(NEWID()))%62 as fld16 into #tt
from dbo.tblNumbers
WHERE ID<= 100000; select [str], ROW_NUMBER() over(order by CHECKSUM(NEWID()))-1 as rn into #t
from (select CHAR(ID+64) as [str] from dbo.tblNumbers where ID <= 26 union all
select CHAR(ID+96) as [str] from dbo.tblNumbers where ID <= 26 union all
select cast(ID-1 as varchar) as [str] from dbo.tblNumbers where ID <= 10) as t select tt.ID, left(t1.str + t2.str + t3.str + t4.str + t5.str + t6.str + t7.str + t8.str +
t9.str + t10.str + t11.str + t12.str + t13.str + t14.str + t15.str + t16.str + REPLICATE(' ',1000),1000) as result
into #tttt
from #tt as tt join
#t t1 on t1.rn = tt.fld1 join
#t t2 on t2.rn = tt.fld2 join
#t t3 on t3.rn = tt.fld3 join
#t t4 on t4.rn = tt.fld4 join
#t t5 on t5.rn = tt.fld5 join
#t t6 on t6.rn = tt.fld6 join
#t t7 on t7.rn = tt.fld7 join
#t t8 on t8.rn = tt.fld8 join
#t t9 on t9.rn = tt.fld9 join
#t t10 on t10.rn = tt.fld10 join
#t t11 on t11.rn = tt.fld11 join
#t t12 on t12.rn = tt.fld12 join
#t t13 on t13.rn = tt.fld13 join
#t t14 on t14.rn = tt.fld14 join
#t t15 on t15.rn = tt.fld15 join
#t t16 on t16.rn = tt.fld16 checkpoint
DBCC DROPCLEANBUFFERS
DBCC FREESYSTEMCACHE('all') select dbo.ufn_MoveCharacterBackOrForwardByNPos(result,'forward',1), result from #tttt
select dbo.ufn_clr_MoveCharacterBackOrForwardByNPos(result,'forward',1), result from #tttt select dbo.ufn_MoveCharacterBackOrForwardByNPos('oOv3lVLo4W3B44L7','forward',1)
select dbo.ufn_clr_MoveCharacterBackOrForwardByNPos('oOv3lVLo4W3B44L7','forward',1) declare @int as int = 1;
declare @cmd as varchar(max) = '';
declare @cmdd as varchar(max) = '';
declare @comand as varchar(max) = '';
declare @comandd as varchar(max) = ''; --select ISNULL(NULLIF(0,0),26) --select @@VERSION
while @int <= 101
begin
set @cmd = @cmd + 'substring(result,'+CAST(@int as varchar)+',1) as fld' +CAST(@int as varchar) + ','
set @cmdd = @cmdd + 'case when ASCII(fld' +CAST(@int as varchar) + ') between 65 and 90 then CHAR(ISNULL(NULLIF((ASCII(fld' +CAST(@int as varchar) + ')-64+1)%26,0),26)+64)
when ASCII(fld' +CAST(@int as varchar) + ') between 97 and 122 then CHAR(ISNULL(NULLIF((ASCII(fld' +CAST(@int as varchar) + ')-64+1)%26,0),26)+64)
when fld' +CAST(@int as varchar) + ' like ''[0-9]'' then CHAR(ISNULL(NULLIF((ASCII(fld' +CAST(@int as varchar) + ')-47+1)%10,0),10)+47)
else fld' +CAST(@int as varchar) + ' end +'; if LEN(@cmd) > 7950
begin
set @comand = @comand + cast(@cmd as varchar(max))
set @cmd = '';
end if LEN(@cmdd) > 7950
begin
--print len(@cmdd)
set @comandd = @comandd + cast(@cmdd as varchar(max))
set @cmdd = '';
end set @int = @int + 1
end
--select @cmdd
if LEN(@cmd) > 0
set @comand = 'select rtrim(result) AS result,' + @comand + cast(left(@cmd,len(@cmd)-1) as varchar(max)) + '
from #tttt as a'
--select @cmdd, LEN(@cmdd)
--select @comandd, LEN(@cmdd)
if LEN(@cmdd) > 0
set @comandd = 'select rtrim(' + @comandd + cast(left(@cmdd,len(@cmdd)-1) as varchar(max)) + ') as final_str, result
from (' + @comand + ') as t' --select @comandd
EXEC( @comandd) --select * from #ttt CREATE TYPE udt_TwoCharacterColumn8000Long
AS TABLE (
col1 VARCHAR(8000) NULL,
col2 VARCHAR(8000) NULL
) alter PROCEDURE usp_UDTtest
@t as udt_TwoCharacterColumn8000Long readonly
as
select * from @t declare @a as udt_TwoCharacterColumn8000Long insert into @a
select 'abc', 'def' exec usp_UDTtest @a

SQL Server ->> Move characters in string N position(s) forward/backward based on ASCII table(根据ASCII表的排列顺序将字符串内的数值往前或者后移N个位)的更多相关文章

  1. SQL server 存储过程 C#调用Windows CMD命令并返回输出结果 Mysql删除重复数据保留最小的id C# 取字符串中间文本 取字符串左边 取字符串右边 C# JSON格式数据高级用法

    create proc insertLog@Title nvarchar(50),@Contents nvarchar(max),@UserId int,@CreateTime datetimeasi ...

  2. sql server alter column 由于一个或多个对象访问此列,ALTER TABLE ALTER COLUMN 失败

    今天在修改一个字段类型,由原来的 varchar(500) 增加到 varchar(1000) 则对应的SQL 语句,执行后如图错误 结果查下来是因为其中一个视图建成了索引视图, 解决办法:先将该视图 ...

  3. SQL Server 不清空数据,修改数据库字段、结构,阻止保存要求重新创建表的更改

    当数据库有数据修改数据库字段时,默认是阻止的! 工具---选项---设计器---阻止保存要求重新创建表的更改(取消钩)

  4. 转:Move all SQL Server system databases at one time

    Problem One task that you may need to do as a DBA is to move the system databases from one location ...

  5. Microsoft SQL Server Trace Flags

    Complete list of Microsoft SQL Server trace flags (585 trace flags) REMEMBER: Be extremely careful w ...

  6. Microsoft SQL Server Version List [sqlserver 7.0-------sql server 2016]

    http://sqlserverbuilds.blogspot.jp/   What version of SQL Server do I have? This unofficial build ch ...

  7. Consuming JSON Strings in SQL Server

    https://www.simple-talk.com/sql/t-sql-programming/consuming-json-strings-in-sql-server/ Consuming JS ...

  8. Microsoft SQL Server Version List(SQL Server 版本)

    原帖地址 What version of SQL Server do I have? This unofficial build chart lists all of the known Servic ...

  9. 转载--SQL Server 2005的XQuery介绍

    原文地址: http://bbs.51cto.com/thread-458009-1-1.html   引用: 摘要 本文介绍了SQL Server 2005能够支持的XQuery的各方面特性如FLW ...

随机推荐

  1. C++_新特性1-类型转换运算符

    C++的创始人认为C语言的类型转换运算符太过于松散.他采取了更加严格的限制允许的类型转换.并添加了4个类型转换运算符. 这部分特性比较高阶,我把它归于奇技淫巧的范畴.这里简单介绍一下,以后实际有用到再 ...

  2. 洛谷 P2147 [SDOI2008]洞穴勘测 (线段树分治)

    题目链接 题解 早就想写线段树分治的题了. 对于每条边,它存在于一段时间 我们按时间来搞 我们可把一条边看做一条线段 我们可以模拟线段树操作,不断分治下去 把覆盖\(l-r\)这段时间的线段筛选出来, ...

  3. AES/ECB/NoPadding 加减密

    package unit; import javax.crypto.Cipher; import javax.crypto.spec.SecretKeySpec; import org.apache. ...

  4. Selenium => Debugging “Element is not clickable at point” error

    [From] http://stackoverflow.com/questions/11908249/debugging-element-is-not-clickable-at-point-error ...

  5. 分享一个js方法

    这是一个关于参数合并的方法,这个场景也经常遇到,比如我们现在要对微信小程序的wx.request进行再一次封装,会涉及到一些默认的参数和每次使用自己传递的参数合并问题,分享代码. var extend ...

  6. 理解 glibc malloc:主流用户态内存分配器实现原理

    https://blog.csdn.net/maokelong95/article/details/51989081 Understanding glibc malloc 修订日志: 2017-03- ...

  7. 利用paramiko的demo_simple.py进行日志记录时遇到的特殊字符

    特殊字符列表: 回车 "\r" "\x13" 响铃 "\x07" 换行 "\n" "\x10" &q ...

  8. Docker_network相关指令

    docker network create创建docker网卡docker network create -d overlay --ip-range=192.168.2.0/24 --gateway= ...

  9. journalctl 中文手册

    版权声明 本文译者是一位开源理念的坚定支持者,所以本文虽然不是软件,但是遵照开源的精神发布. 无担保:本文译者不保证译文内容准确无误,亦不承担任何由于使用此文档所导致的损失. 自由使用:任何人都可以自 ...

  10. 如何实现一个简单的MVVM框架

    接触过web开发的同学想必都接触过MVVM,业界著名的MVVM框架就有AngelaJS.今天闲来无事,决定自己实现一个简单的MVVM框架玩一玩.所谓简单,就是仅仅实现一个骨架,仅表其意,不摹其形. 分 ...