SQL Server ->> Move characters in string N position(s) forward/backward based on ASCII table(根据ASCII表的排列顺序将字符串内的数值往前或者后移N个位)
去年无聊的时候想到想玩一下根据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个位)的更多相关文章
- SQL server 存储过程 C#调用Windows CMD命令并返回输出结果 Mysql删除重复数据保留最小的id C# 取字符串中间文本 取字符串左边 取字符串右边 C# JSON格式数据高级用法
create proc insertLog@Title nvarchar(50),@Contents nvarchar(max),@UserId int,@CreateTime datetimeasi ...
- sql server alter column 由于一个或多个对象访问此列,ALTER TABLE ALTER COLUMN 失败
今天在修改一个字段类型,由原来的 varchar(500) 增加到 varchar(1000) 则对应的SQL 语句,执行后如图错误 结果查下来是因为其中一个视图建成了索引视图, 解决办法:先将该视图 ...
- SQL Server 不清空数据,修改数据库字段、结构,阻止保存要求重新创建表的更改
当数据库有数据修改数据库字段时,默认是阻止的! 工具---选项---设计器---阻止保存要求重新创建表的更改(取消钩)
- 转: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 ...
- Microsoft SQL Server Trace Flags
Complete list of Microsoft SQL Server trace flags (585 trace flags) REMEMBER: Be extremely careful w ...
- 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 ...
- Consuming JSON Strings in SQL Server
https://www.simple-talk.com/sql/t-sql-programming/consuming-json-strings-in-sql-server/ Consuming JS ...
- 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 ...
- 转载--SQL Server 2005的XQuery介绍
原文地址: http://bbs.51cto.com/thread-458009-1-1.html 引用: 摘要 本文介绍了SQL Server 2005能够支持的XQuery的各方面特性如FLW ...
随机推荐
- window 系统 cygwin swool 问题
cygwin 终端乱码 端口占用 查看 tcp 端口: netstat -tno 或者 netstat -an | grep 端口 杀死进程号 : kill 进程号 ---> 143 ...
- C++_类继承1-从一个简单的类开始
面向对象编程的主要目的之一是:提供可重用的代码.尤其是项目很庞大的时候,重用测试过的代码比重新编码代码要好得多. C++提供了更高层次的重用性.其中之一就是继承这个概念. 一些厂商提供了类库.类库由类 ...
- P4320 道路相遇
[Luogu4320] 必经点数==圆方树上两点路径上圆点数 也就等于边数/2+1 没什么好说的 , 看代码 #include<cstdio> #include<iostream&g ...
- 1144G Two Merged Sequences ( 贪心+构造)
题目:https://codeforces.com/problemset/problem/1144/G 题意: 将一个序列分成两个序列,两个序列中元素的相对顺序保持和原序列不变,使得分出的两个序列一个 ...
- POJ - 1948 二维01背包
T了两发,DP方程很简单粗暴 dp[i][j][k]:用前i物品使得容量分别为j和k的背包恰好装满 背包的调用只需一次即可,第一次T就是每次check都丧心病狂地背包一次 对于sum的枚举,其实i j ...
- 前端 s 标签获取值
1. s标签获取action中的值: <s:property value="#parameters.mySessionPropKey"/> or <s:prop ...
- MySQL 重设root密码
Mysql 5.6.15版本的windows下的重设root密码,找了n个帖子终于弄明白了. 1. 开一个cmd窗口,进入Mysql的安装目录的bin文件夹,然后运行这个: mysqld --skip ...
- selenium 安装与环境配置
selenium的安装 环境配置:python2.7+selenium2+Firefox46以下版本 本次安装环境:python2.7.13+selenium2.53.6+Firefox46 官网下载 ...
- rancher 2.X 搭建小型web集群+mysql主从复制
一,环境配置 rancher 2.1.6 二,配置harbor私有仓库 见上文 三,配置私有镜像 01,总文件 dockerfile 为主配置文件,html 为站点文件wordpress.,官网 ...
- k8s单节点集群部署应用
之所以用k8s来部署应用,就是因为k8s可以灵活的控制集群规模,进行扩充或者收缩.生产上我们要配置的参数较多,命令行的方式显然不能满足需求,我们应该使用基于配置文件的方式.接下来做一个部署的demo: ...