SQL字符串分割解析

--方法一:动态SQL法

declare @s varchar(50),@sql varchar(300)
set @s=‘1,2,3,4,5,6,7,8,9,10‘
set @sql=‘select col=‘‘‘+ replace(@s,‘,‘,‘‘‘ union all select ‘‘‘)+‘‘‘‘
print @sql
exec (@sql)  

if exists (select * from dbo.sysobjects
where id = object_id(N‘[dbo].[f_splitSTR]‘) and xtype in (N‘FN‘, N‘IF‘, N‘TF‘))
drop function [dbo].[f_splitSTR]
GO  

--方法二:循环截取法

create function f_splitSTR(
    @s   varchar(8000),   --待分拆的字符串
    @split varchar(10)     --数据分隔符
)returns @re table(col varchar(100))
As
Begin
    Declare @splitlen int  --分隔符长度
    Set @splitlen=len(@split+‘a‘)-2
    While CharIndex(@split,@s)>0
    Begin
        Insert @re Values(left(@s,CharIndex(@split,@s)-1))
        --STUFF ( character_expression , start , length ,character_expression )
        Set @s=Stuff(@s,1,CharIndex(@split,@s)+@splitlen,‘‘)
        --Set @s = Substring(@s, CharIndex(@split,@s)[email protected], 100)
    End
    Insert @re Values(@s)
    return
End
GO  

if exists (select * from dbo.sysobjects
where id = object_id(N‘[dbo].[f_splitSTR]‘) and xtype in (N‘FN‘, N‘IF‘, N‘TF‘))
drop function [dbo].[f_splitSTR]
GO  

--方法三:使用临时性分拆辅助表法

Create function f_splitSTR(
    @s   varchar(8000),  --待分拆的字符串
    @split varchar(10)     --数据分隔符
)returns @re table(col varchar(100))
As
Begin
    --创建分拆处理的辅助表(用户定义函数中只能操作表变量)
    Declare @t table(ID int identity,b bit)
    Insert @t(b) Select top 8000 0 from syscolumns a,syscolumns b
    Insert @re Select SubString(@s,ID,CharIndex(@split,@s+@split,ID)-ID)
           from @t  Where ID<=len(@s+‘a‘) And CharIndex(@split,@split+@s,ID)=ID
    return
End
GO  

if exists (select * from dbo.sysobjects
where id = object_id(N‘[dbo].[f_splitSTR]‘) and xtype in (N‘FN‘, N‘IF‘, N‘TF‘))
drop function [dbo].[f_splitSTR]
GO
if exists (select * from dbo.sysobjects
where id = object_id(N‘[dbo].[tb_splitSTR]‘) and objectproperty(id,N‘IsUserTable‘)=1)
drop table [dbo].[tb_splitSTR]
GO  

--方法四:使用永久性分拆辅助表法  --字符串分拆辅助表

SELECT TOP 8000 ID=IDENTITY(int,1,1) INTO dbo.tb_splitSTR
FROM syscolumns a,syscolumns b
GO
--字符串分拆处理函数
Create function f_splitSTR(
    @s     nvarchar(8000),  --待分拆的字符串
    @split  nvarchar(10)     --数据分隔符
)returns table
As
    return(
        --cast类型转换函数 --CharIndex( exp1 , exp2 [,start_location])
        Select col=cast(SubString(@s,ID,CharIndex(@split,@s+@split,ID)-ID) as nvarchar(100))
        From tb_splitSTR  Where ID<=len(@s+‘a‘) and CharIndex(@split,@split+@s,ID)=ID)
GO  

--方法五:利用sql server2005的OUTER APPLY

Create function [dbo].[fn_Split]
(
  @str nvarchar(max) ,
  @split nvarchar(10)
  return table
  As
  return
    ( Select    B.id
      --Convert (data_type[(length)], expression [, style]) 类型转换
      From  ( Select  [value] = convert(XML , ‘<v>‘ + Replace(@str , @split , ‘</v><v>‘)
                     + ‘</v>‘) ) A
      Outer Apply ( Select  id = N.v.value(‘.‘ , ‘varchar(100)‘)
                    From  A.[value].nodes(‘/v‘) N ( v )
                  ) B
    ) 

--备注说明:  方法4必须在sql server2005下才可以运行

时间: 2024-10-12 00:46:58

SQL字符串分割解析的相关文章

sql字符串分割

字符串:declare @str varchar(1000)='0208588A_0208588,0098256A_0208588,0224208A_0224208,' 分割结果: 示例sql: declare @str varchar(1000)='0208588A_0208588,0098256A_0208588,0224208A_0224208,' --declare @str varchar(1000)='0080203A_0080203,0080215A_0080203,' decla

SQL 字符串分割表函数

1 --字符串分割表函数 2 declare @str varchar(1000) 3 declare @split varchar(10) 4 5 declare @i int; 6 declare @count int; 7 8 declare @ChildStr varchar(1000); 9 declare @splitStr varchar(1000); 10 declare @Index int; 11 12 declare @table as table (rowId int,s

mysql 字符串分割 和 动态执行拼接sql

本人以前主要用的是MSSQL,最近项目在使用MYSQL,自己是一个 典型的小白.今天就记录一下 一个mysql存储过程,里面需要分割字符串和 动态执行sql语句. 关于字符串 分割我开始使用 LOCATE 和Position来做,不知道在proc 里面有时候报错,单独的查询有可以.后来在网上 找了一个 Mysql存储过程中字符串分割文章, 很多地方都推荐使用  SET @result = REVERSE(SUBSTRING_INDEX(REVERSE(SUBSTRING_INDEX(plate_

PCB MS SQL表值函数与CLR 表值函数 (例:字符串分割转表)

将字符串分割为表表经常用到,这里 SQL表值函数与CLR  表值函数,两种实现方法例出来如下: SELECT * FROM FP_EMSDB_PUB.dbo.SqlSplit('/','1oz/1.5oz/2oz/3oz') 效果如下: SQL实现表值函数 CREATE FUNCTION [dbo].[splitStr]( @s varchar(max), --待分拆的字符串 @split varchar(10) --数据分隔符 )RETURNS @re TABLE(id int IDENTIT

C#为工作Sql而产生的字符串分割小工具(很实用,你值得拥有)

写在前面 为什么要写这个工具? 工作需要,拼接字符串头晕眼花拼接的,特别是in 查询,后面的参数太多,想在数据执行一些这个sql语句老费劲了. 看正文 工作所有的(后台)攻城狮们都会接触到sql语句,最常见的sql语句有很多,特别 in 查询,举个最简单的例子就是 SELECT * FROM SMSSENTLOG201505 WHERE ACCOUNTCODE IN ('PDA','ORDER','APP','WEB','ZHONGTIAN','00006','02100','CALLCENTE

代码收藏系列--php--加载sql文件并解析成数组

php加载sql文件,解析成以分号分割的数组.(支持存储过程和函数提取,自动过滤注释) /** * 加载sql文件为分号分割的数组 * <br />支持存储过程和函数提取,自动过滤注释 * <br />例如: var_export(load_sql_file('mysql_routing_example/fn_cdr_parse_accountcode.sql')); * @param string $path 文件路径 * @return boolean|array * @sin

php 将一个字符串分割为组成它的字符

问: php里如何将一个字符串分割为组成它的字符? 比如hello  -> [h, e, l, l, o]   以下有三种方法: 这是需要被分割的字符串:  $str = 'Hello小样'; 字符串的长度: $len = mb_strlen($str, 'utf8');// 7   第一种:  $arr = str_split($str); p($arr); [总结]: 这里直接使用str_split 方法来分割, 但不幸的是这个方法不支持中文的解析, 这里可以考虑下mb_split的分割,

(六)PL/SQL字符串

PL/SQL字符串实际上是一个可选的尺寸规格字符序列.字符可以是数字,字母,空白,特殊字符或全部的组合. PL/SQL提供了三种类型的字符串:  固定长度字符串:在这样的字符串,程序员指定的长度,同时声明该字符串.该字符串是右填充空格以达到指定的长度.  变长字符串:在这样的字符串,最大长度可达32,767,为字符串指定,并不需要填充.  字符大对象(CLOB) :这是可变长度的字符串,可以达到128兆兆字节. PL/ SQL字符串可以是变量或字面值.字符串文字被引号围在内部.例如:'This

C++ 字符串分割

2017-06-26 21:47:06 这几天在做大数据的处理,需要处理几百万的数据.由于一直用的是c++,所以就直接用c++进行了编码. 不过后来经过学长的提醒发现其实字符串处理,尤其是处理csv文件(由逗号作为分割符)时,需要将各个部分分割开来,如果用Java或者Python进行处理的话会非常方便,比如Java就有split函数进行字符串的分割,不过我在查询资料之后发现c++中并没有现成的针对string的字符串分割函数.于是我自己写了一个split函数. 这个函数的声明是 void spl