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 ...
随机推荐
- UESTC - 621
f[n]:sigma(i,n),i<n g[n]:sigmaf[i],i<=n #include<bits/stdc++.h> using namespace std; con ...
- Oracle列转行函数Listagg以及pivot查询示例
简单的Oracle列转行函数Listagg示例: CREATE TABLE tbl_test (catalog VARCHAR(1),product VARCHAR(2),amount NUMBER) ...
- 【研究】Discuz<3.4任意文件删除漏洞
这里以Discuz3.2为例 关键字:Powered by Discuz! X3.2 时间有限,就不一一截图了,Discuz所有页面全在Discuz_X3.2_SC_UTF8/upload/目录下 利 ...
- 解决运行vue项目的报错This relative module was not found:
运行vue项目出现这样的报错. This relative module was not found: * ../../assets/img/spot.png !./src/components/on ...
- java多线程-Lock
大纲: Lock接口 synchronized&Lock异同 一.Lock public interface Lock { void lock(); void lockInterruptibl ...
- js 替换中间四位手机号为 *
replace(/(\d{})\d{}(\d{})/, '$1****$2')
- 问题1-xshell远程连接不上linux主机
在其他主机上搭建linux系统,我们一般通过xshell工具去远程访问该主机,这样不仅可以方便我们的对系统或者集群进行管理也方便了我们的操作,但是在搭建好环境的时候遇到如下问题: 解决方案:1.关闭目 ...
- springMVC静态资源访问
springMVC默认是访问不到静态资源的,如css,js等,需要在xml里进行配置 保证已经配置好了 web.xml, <!-- Spring MVC servlet --> <s ...
- 【卷土重来之C#学习笔记】(一)c#文章导航目录
[卷土重来之C#学习笔记](一)c#文章导航目录 [卷土重来之C#学习笔记](二)c#编程概述 [卷土重来之C#学习笔记](三)类型.存储.对象 [卷土重来之C#学习笔记](四)类的基本概念 [卷土重 ...
- URAL ——1249——————【想法题】
Ancient Necropolis Time Limit:5000MS Memory Limit:4096KB 64bit IO Format:%I64d & %I64u ...