一.本文所涉及的内容(Contents)

  1. 本文所涉及的内容(Contents)
  2. 背景(Contexts)
  3. 游标模板(Cursor Template)
  4. 鼠标轨迹字符串分割SQL脚本实现(SQL Codes)
  5. 补充说明(Addon)

二.背景(Contexts)

  我们的系统中记录了用户的鼠标行为轨迹字符串,这些字符串的格式是:PosSet:[573,1103,2010-09-03 22:32:35],[864,110,2010-09-03 22:32:57],这个字段表示用户点击页面的X坐标,Y坐标,时间。现在要求对这样字符串进行分割。

  需要注意的是当字符串只有一个坐标的时候,如:PosSet:[513,1303,2010-09-03 22:34:35],你需要考虑这种情况的处理,因为这个时候就没有分隔字符在字符串了。

  还需要考虑字符串不规则的时候的异常处理;

(Figure1:基础数据)

(Figure2:实现效果图)

三.游标模板(Cursor Template)

  在正式解决问题之前我先提供一个游标的模板,它简单的实现了找出数据库中所有的数据库名,其实这个模板的目的是为了提供一个规范化的游标SQL代码模板。

  1. --游标模板
  2. DECLARE @databaseName VARCHAR(100)
  3.  
  4. DECLARE @itemCur CURSOR
  5. SET @itemCur = CURSOR FOR
  6. SELECT name FROM sys.databases
  7. WHERE database_id > 4
  8.  
  9. OPEN @itemCur
  10. FETCH NEXT FROM @itemCur INTO @databaseName
  11. WHILE @@FETCH_STATUS=0
  12. BEGIN
  13. --逻辑处理
  14. PRINT @databaseName
  15.  
  16. FETCH NEXT FROM @itemCur INTO @databaseName
  17. END
  18.  
  19. CLOSE @itemCur
  20. DEALLOCATE @itemCur

(Figure3:返回数据库名)

四.鼠标轨迹字符串分割SQL脚本实现(SQL Codes)

(一) 首先创建测试表VisiteLog,并插入测试数据:

  1. --创建测试表[VisiteLog]
  2. CREATE TABLE [dbo].[VisiteLog](
  3. [Id] [int] IDENTITY(1,1) NOT NULL,
  4. [PosSet] [varchar](500) NULL,
  5. CONSTRAINT [PK_VisiteLog] PRIMARY KEY CLUSTERED
  6. (
  7. [Id] ASC
  8. )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
  9. ) ON [PRIMARY]
  10. GO
  11.  
  12. --插入测试数据
  13. SET IDENTITY_INSERT [dbo].[VisiteLog] ON
  14. INSERT [dbo].[VisiteLog] ([Id], [PosSet]) VALUES (1, N'[573,1103,2010-09-03 22:32:35],[864,110,2010-09-03 22:32:57]')
  15. INSERT [dbo].[VisiteLog] ([Id], [PosSet]) VALUES (2, N'[513,1303,2010-09-03 22:34:35]')
  16. SET IDENTITY_INSERT [dbo].[VisiteLog] OFF
  17.  
  18. --查看数据
  19. SELECT * FROM [dbo].[VisiteLog]

(Figure4:基础数据)

(二) 接着创建表PosSetInfo,这个表是用来保存鼠标轨迹字符串分割后的数据:

  1. --创建表[PosSetInfo]
  2. CREATE TABLE [dbo].[PosSetInfo](
  3. [ID] [int] NULL,
  4. [PosSet_x] [int] NULL,
  5. [PosSet_y] [int] NULL,
  6. [PosTime] [datetime] NULL
  7. ) ON [PRIMARY]
  8. GO

(三) 根据鼠标轨迹字符串:[573,1103,2010-09-03 22:32:35],[864,110,2010-09-03 22:32:57]。它坐标点与坐标点之间的分隔符是“,”,X坐标与Y坐标同样适用分隔符“,”,这给我们的分割带来了一些不便,所以我们创建了一个函数,它的作用是把字符串@str以@split分隔符进行分隔,返回第@index次匹配的元素。如下图所示:

  1. -- =============================================
  2. -- Author: <听风吹雨>
  3. -- Create date: <2010/05/27>
  4. -- Description: <把字符串@str@split分隔符进行分隔,返回第@index次匹配的元素>
  5. -- =============================================
  6. CREATE FUNCTION [dbo].[Get_StrArrayStrOfIndex]
  7. (
  8. @str VARCHAR(5000), --要分割的字符串
  9. @split VARCHAR(10), --分隔符号
  10. @index INT --取第几个元素
  11. )
  12. RETURNS VARCHAR(5000)
  13. AS
  14. BEGIN
  15. DECLARE @location INT
  16. DECLARE @start INT
  17. DECLARE @next INT
  18. DECLARE @seed INT
  19. SET @str=LTRIM(RTRIM(@str))
  20. SET @start=1
  21. SET @next=1
  22. SET @seed=LEN(@split)
  23.  
  24. SET @location=CHARINDEX(@split,@str)
  25. WHILE @location<>0 and @index>@next
  26. BEGIN
  27. SET @start=@location+@seed
  28. SET @location=CHARINDEX(@split,@str,@start)
  29. SET @next=@next+1
  30. END
  31. IF @location =0 SELECT @location =LEN(@str)+1
  32. RETURN SUBSTRING(@str,@start,@location-@start)
  33. END
  34.  
  35. --测试函数
  36. SELECT DBO.[Get_StrArrayStrOfIndex]('AB,CDE,FG,HIJK',',',3);

(Figure5:函数测试效果)

(四) 下面的SQL脚本就是对VisiteLog表的数据进行分割,再把分割后的字符串保存到PosSetInfo表中,这个脚本的主要做法是先把[573,1103,2010-09-03 22:32:35],[864,110,2010-09-03 22:32:57]以“]”做为分隔符,把数据分割成两段:[573,1103,2010-09-03 22:32:35]和[864,110,2010-09-03 22:32:57],再以“,”做为分割符,找出X坐标、Y坐标和时间;

  1. --鼠标轨迹字符串分割
  2. DECLARE @ID int,@PosSet VARCHAR(2000)
  3. DECLARE @splitlen INT
  4. DECLARE @split NVARCHAR(10)
  5. DECLARE @temp VARCHAR(100)
  6. DECLARE @PosSet_x INT
  7. DECLARE @PosSet_y INT
  8. DECLARE @PosTime DATETIME
  9. SET @split = ']'
  10. DECLARE @itemCur CURSOR
  11. SET @itemCur = CURSOR FOR
  12. SELECT ID,PosSet FROM [VisiteLog]
  13. WHERE PosSet <> ''
  14.  
  15. OPEN @itemCur
  16. FETCH NEXT FROM @itemCur INTO @ID,@PosSet
  17. WHILE @@FETCH_STATUS=0
  18. BEGIN
  19. SET @splitlen=LEN(@split+'a')-2
  20. WHILE CHARINDEX(@split,@PosSet)>0
  21. BEGIN
  22. SET @Temp = LEFT(@PosSet,CHARINDEX(@split,@PosSet)-1)
  23. SET @Temp = replace(replace(@Temp,',[',''),'[','')
  24. SET @PosSet_x = dbo.Get_StrArrayStrOfIndex(@Temp,',',1)
  25. SET @PosSet_y = dbo.Get_StrArrayStrOfIndex(@Temp,',',2)
  26. SET @PosTime = dbo.Get_StrArrayStrOfIndex(@Temp,',',3)
  27. INSERT PosSetInfo VALUES(@ID,@PosSet_x,@PosSet_y,@PosTime)
  28. SET @PosSet=STUFF(@PosSet,1,CHARINDEX(@split,@PosSet)+@splitlen,'')
  29. END
  30.  
  31. FETCH NEXT FROM @itemCur INTO @ID,@PosSet
  32. END
  33.  
  34. CLOSE @itemCur
  35. DEALLOCATE @itemCur

执行完上面运用游标的SQL脚本,现在查看PosSetInfo表的数据,返回的结果如下图所示:

  1. --查看数据
  2. SELECT * FROM [dbo].[PosSetInfo]

(Figure6:分割后数据)

五.补充说明(Addon)

(一) 如果需要循环每个数据库进行操作,你可以使用下面的SQL脚本:

  1. --循环每个数据库
  2. EXEC sp_MSForEachDB 'USE [?];
  3. SELECT * FROM sys.database_files'

(Figure7:sp_MSForEachDB效果图)

更多sp_MSForEachDB和sp_MSforeachtable的运用,可以参考:

SQL Server 游标运用:查看一个数据库所有表大小信息(Sizes of All Tables in a Database)

SQL Server 游标运用:查看所有数据库所有表大小信息(Sizes of All Tables in All Database)

(二) 步骤四中处理SQL代码可能性能不是最优的,因为就函数Get_StrArrayStrOfIndex的调用就已经非常频繁的,如果一个PosSet字段的值非常多,你可以考虑用一个表值函数返回一个表。

SQL Server 游标运用:鼠标轨迹字符串分割的更多相关文章

  1. SQL Server游标 C# DataTable.Select() 筛选数据 什么是SQL游标? SQL Server数据类型转换方法 LinQ是什么? SQL Server 分页方法汇总

    SQL Server游标   转载自:http://www.cnblogs.com/knowledgesea/p/3699851.html. 什么是游标 结果集,结果集就是select查询之后返回的所 ...

  2. SQL Server日期时间格式转换字符串详解 (详询请加qq:2085920154)

    在SQL Server数据库中,SQL Server日期时间格式转换字符串可以改变SQL Server日期和时间的格式,是每个SQL数据库用户都应该掌握的.本文我们主要就介绍一下SQL Server日 ...

  3. SQL Server日期时间格式转换字符串

    在SQL Server数据库中,SQL Server日期时间格式转换字符串可以改变SQL Server日期和时间的格式,是每个SQL数据库用户都应该掌握的.本文我们主要就介绍一下SQL Server日 ...

  4. SQL Server日期时间格式转换字符串详解

    本文我们主要介绍了SQL Server日期时间格式转换字符串的相关知识,并给出了大量实例对其各个参数进行对比说明,希望能够对您有所帮助. 在SQL Server数据库中,SQL Server日期时间格 ...

  5. SQL点滴3—一个简单的字符串分割函数

    原文:SQL点滴3-一个简单的字符串分割函数 偶然在电脑里看到以前保存的这个函数,是将一个单独字符串切分成一组字符串,这里分隔符是英文逗号“,”  遇到其他情况只要稍加修改就好了 CREATE FUN ...

  6. sql server 游标的简单用法

    sql server游标: --定义游标 declare cursor1 cursor for select ID,Name from A --打开游标 open cursor1 declare @i ...

  7. 使用IP连接SQL SERVER或者配置为连接字符串失败

    使用IP连接SQL SERVER或者配置为连接字符串失败 情景一:当在webconfig文件中使用   <add key="ConnectionString" value=& ...

  8. .net连接sql server的几种连接字符串的写法

    .net连接sql server的几种连接字符串的写法 1, 混合验证模式登录 server=电脑名 或 电脑IP;database=数据库名;uid=数据库登录名;password=数据库登录密码 ...

  9. SQL Server 游标运用:查看所有数据库所有表大小信息(Sizes of All Tables in All Database)

    原文:SQL Server 游标运用:查看所有数据库所有表大小信息(Sizes of All Tables in All Database) 一.本文所涉及的内容(Contents) 本文所涉及的内容 ...

随机推荐

  1. 【AR实验室】OpenGL ES绘制相机(OpenGL ES 1.0版本)

    0x00 - 前言 之前做一些移动端的AR应用以及目前看到的一些AR应用,基本上都是这样一个套路:手机背景显示现实场景,然后在该背景上进行图形学绘制.至于图形学绘制时,相机外参的解算使用的是V-SLA ...

  2. 复杂的 Hash 函数组合有意义吗?

    很久以前看到一篇文章,讲某个大网站储存用户口令时,会经过十分复杂的处理.怎么个复杂记不得了,大概就是先 Hash,结果加上一些特殊字符再 Hash,结果再加上些字符.再倒序.再怎么怎么的.再 Hash ...

  3. Socket聊天程序——客户端

    写在前面: 上周末抽点时间把自己写的一个简单Socket聊天程序的初始设计和服务端细化设计记录了一下,周二终于等来毕业前考的软考证书,然后接下来就是在加班的日子度过了,今天正好周五,打算把客户端的详细 ...

  4. ABP文档 - EntityFramework 集成

    文档目录 本节内容: Nuget 包 DbContext 仓储 默认仓储 自定义仓储 特定的仓储基类 自定义仓储示例 仓储最佳实践 ABP可使用任何ORM框架,它已经内置了EntityFrame(以下 ...

  5. 【Win 10 应用开发】在App所在的进程中执行后台任务

    在以往版本中,后台任务都是以独立的专用进程来运行,因此,定义后台任务代码的类型都要位于 Windows 运行时组件项目中. 不过,在14393中,SDK 作了相应的扩展,不仅支持以前的独立进程中运行后 ...

  6. myrocks复制中断问题排查

    背景 mysql可以支持多种不同的存储引擎,innodb由于其高效的读写性能,并且支持事务特性,使得它成为mysql存储引擎的代名词,使用非常广泛.随着SSD逐渐普及,硬件存储成本越来越高,面向写优化 ...

  7. 用C++实现Linux中shell的ls功能

    实现输出当前目录下的文件名 ls功能: 方法一: #include <iostream> #include <algorithm> #include <stdio.h&g ...

  8. centos下彻底删除 和重装MYSQL

    1 删除Mysql      yum remove  mysql mysql-server mysql-libs mysql-server;       find / -name mysql 将找到的 ...

  9. [转载]Java 8 日期&时间 API

    Java 8 日期和时间 声明 本文转自http://www.journaldev.com/2800/java-8-date-localdate-localdatetime-instant,以mark ...

  10. 机器指令翻译成 JavaScript —— No.7 过渡语言

    上一篇,我们决定使用 LLVM 来优化程序,并打算用 C 作为输入语言.现在我们来研究一下,将 6502 指令转换成 C 的可行性. 跳转支持 翻译成 C 语言,可比 JS 容易多了.因为 C 支持 ...