SQL--字符串转table

转载 2015年07月09日 15:45:27

SQL 的存储过程或着自定义函数,有时候,我们希望类似传递一个数组的对象给这个存储过程或着自定义函数.

但是 SQL 并不支持数组的输入参数。

这时候,我们一般是传递一个合并后的字符串给存储过程,然后在存储过程中解析这个字符串。

这个技术,很多地方都有收集,今天在  Arrays and Lists in SQL Server http://www.sommarskog.se/arrays-in-sql.html  看到一个经典的总结。这个地方涉及到的一些总结函数,我就不再提到了。非常感谢 Erland Sommarskog, SQL Server MVP.

给了我们这个丰富的,SQL 中如何处理数组的总结。

下面把一段字符串解析成Guid数组的SQL自定义函数,上述文章中并没有提供,我是改写自其中的 iter_charlist_to_table 自定义函数来实现的。

郭红俊提供的SQL自定义函数调用范例如下:

select * from iter_uniqueidentifierlist_to_table(
'
0E099B0F-AFE3-4FCA-B634-014DF91AA79B,
7EF06D1D-081D-4957-97A1-015CAA4B00E7,
B18BD78B-77F5-4AA9-A3B8-016776176924,
BB1E54BE-BB91-4FE4-8267-0234BD798A1D,
B74FC01A-F33E-4CF3-8B79-02391D5E89BD,
94DE017F-0C7E-4750-94CD-0266C38C4D71,
CF94841D-87D3-4792-A886-0269745796A6'
,',')

这个自定义函数的实现如下:

    --
   -- http://www.sommarskog.se/arrays-in-sql.html
   --
   -- 把一个字符串组成的 uniqueidentifier 列表转换成一个 table
  
   CREATE FUNCTION iter_uniqueidentifierlist_to_table
                    (@list      ntext,
                     @delimiter nchar(1) = N',')
         RETURNS @tbl TABLE (listpos int IDENTITY(1, 1) NOT NULL,
                             guidID     uniqueidentifier NOT NULL) AS

   BEGIN
      DECLARE @pos      int,
              @textpos  int,
              @chunklen smallint,
              @tmpstr   nvarchar(4000),
              @leftover nvarchar(4000),
              @tmpval   nvarchar(4000),
              @id uniqueidentifier

      SET @textpos = 1
      SET @leftover = ''
      WHILE @textpos <= datalength(@list) / 2
      BEGIN
         SET @chunklen = 4000 - datalength(@leftover) / 2
         SET @tmpstr = @leftover + substring(@list, @textpos, @chunklen)
         SET @textpos = @textpos + @chunklen

         SET @pos = charindex(@delimiter, @tmpstr)

         WHILE @pos > 0
         BEGIN
            SET @tmpval = left(ltrim(rtrim(@tmpstr)), @pos - 1)
            SET @tmpval = replace(@tmpval,char(9),'')
            SET @tmpval = replace(@tmpval,char(10),'')
            SET @tmpval = replace(@tmpval,char(13),'')
            -- print( @tmpval)
            set @id = convert(uniqueidentifier,@tmpval);
            INSERT @tbl (guidID) VALUES(@id)
           
            SET @tmpstr = substring(@tmpstr, @pos + 1, len(@tmpstr))
            SET @pos = charindex(@delimiter, @tmpstr)
         END

         SET @leftover = @tmpstr
      END
   -- print @leftover
            SET @leftover = ltrim(rtrim(@leftover))
            SET @leftover = replace(@leftover, char(9),'')
            SET @leftover = replace(@leftover, char(10),'')
            SET @leftover = replace(@leftover, char(13),'')
            set @id = convert(uniqueidentifier,@leftover);
            INSERT @tbl (guidID) VALUES(@id)

   RETURN
   END

相关文章推荐

json字符串转table字符串

  • 2016年12月13日 15:48
  • 1.12MB
  • 下载

转 Lua标准库: table函数, 数学函数, 字符串函数/格式化/配对, WoW新增函数, 函数别名

这里只介绍和插件编写比较有关的几个函数. 详细的Lua手册请参照Lua Reference Manual 5.1. assert(value) - 检查一个值是否为非nil, 若不是则(如果...

转 Lua标准库: table函数, 数学函数, 字符串函数/格式化/配对,

assert(value) - 检查一个值是否为非nil, 若不是则(如果在wow.exe打开调试命令)显示对话框以及输出错误调试信息 collectgarbage() - 垃圾收集器. (新增...
  • weiqubo
  • weiqubo
  • 2015年06月15日 16:33
  • 1211

使用SQL2005自带扩展函数对字符串进行MD5加密(转)

最近,在工作中遇到一个系统整合需求,要求将两个系统的用户进行整合,最终实现用户同步登录效果。 通过分析发现其中一个系统用户密码采用了MD5加密,而另一个系统用户密码为明码存放,为了达到同步登录的要求...

SQL Server 日期时间转字符串

一、sql server日期时间函数 Sql Server中的日期与时间函数  1.  当前系统日期、时间      select getdate()   2. dateadd  在向指定日期...

java.util.Date 与 java.sql.Date互转 及 字符串转换为日期时间格式

转载自:http://wenku.baidu.com/view/55259a2db4daa58da0114a0c.html 1、将java.util.Date 转换为 java.sql....

使用SQL语句查询日期(当月天数,当月第一天,当月最后一天,本年最后一天,当月第一个星期) 日期转字符串

取某月天数:select day(dateadd(month,1,'2012-02-01')-1) --当月天数 select day(dateadd(ms,-3,DATEADD(m, DATEDIF...
  • my98800
  • my98800
  • 2017年05月01日 19:35
  • 227

java.util.Date_与_java.sql.Date互转_及_字符串转换为日期时间格式

前提是实体类的属性是util包下的的date,因此set的属性也是util包下的的date,sql包中的Date类是util包中Date类的子类 一、在当你遇到编译时出现错误: com.mic...

sql server日期时间转字符串

一、sql server日期时间函数 Sql Server中的日期与时间函数  1.  当前系统日期、时间      select getdate()   2. dateadd  在向指定...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:SQL--字符串转table
举报原因:
原因补充:

(最多只允许输入30个字)