在sql server里,调用存储过程时,经常需要将数据拼成字符串做为参数调用存储过程,而在储存过程中分割字符串虽然简单但麻烦,封装了该函数,可以将拼串分割成内存表返回,方便使用,返回的表字段从a,b,c,d,e开始,最多支持15列

调用方式:select * from flfcp_StrSplitToTable('a,b,c|e,f,g', ',', '|')

返回结果:

调用方式:select * from flfcp_StrSplitToTable('a,b,c,e,f,g', ',', '')

返回结果:

调用方式:select * from flfcp_StrSplitToTable('a,b,c,e,f,g', '', ',')

返回结果:

/****** Object:  UserDefinedFunction [dbo].[flfcp_StrSplitToTable]    Script Date: 08/05/2013 20:29:07 ******/
SET QUOTED_IDENTIFIER ON
GO
CREATE FUNCTION [dbo].[flfcp_StrSplitToTable](@strList VARCHAR(5000), @columnSplitChar VARCHAR(1), @rowSplitChar VARCHAR(1))
RETURNS @tempTable TABLE(ID INT IDENTITY(1,1) PRIMARY KEY,
    [A] [varchar](100) NULL,
    [B] [varchar](100) NULL,
    [C] [varchar](100) NULL,
    [D] [varchar](100) NULL,
    [E] [varchar](100) NULL,
    [F] [varchar](100) NULL,
    [G] [varchar](100) NULL,
    [H] [varchar](100) NULL,
    [I] [varchar](100) NULL,
    [J] [varchar](100) NULL,
    [K] [varchar](100) NULL,
    [L] [varchar](100) NULL,
    [M] [varchar](100) NULL,
    [N] [varchar](100) NULL,
    [O] [varchar](100) NULL ) 
AS
BEGIN 
 DECLARE @A varchar(100)
 DECLARE @B varchar(100)
 DECLARE @C varchar(100)
 DECLARE @D varchar(100)
 DECLARE @E varchar(100)
 DECLARE @F varchar(100)
 DECLARE @G varchar(100)
 DECLARE @H varchar(100)
 DECLARE @I varchar(100)
 DECLARE @J varchar(100)
 DECLARE @K varchar(100)
 DECLARE @L varchar(100)
 DECLARE @M varchar(100)
 DECLARE @N varchar(100)
 DECLARE @O varchar(100)
    
 DECLARE @colNo  INT     -- 列的序号
 DECLARE @colStart INT     -- 列开始查询位置
 DECLARE @colEnd  INT     -- 列查找到的位置
 DECLARE @strData VARCHAR(2000)  -- 内容 
 DECLARE @colData VARCHAR(2000)  -- 列内容 
 DECLARE @rowStart INT     -- 行开始查询位置
 DECLARE @rowEnd  INT     -- 行查找到的位置
 DECLARE @strLen  INT     -- 字符串长度
 DECLARE @LastFlag INT     -- 最后一行标志
 DECLARE @LastFlag2 INT     -- 最后一行标志
 
 SET @LastFlag=1
 SET @LastFlag2=1
    
 IF ( LEN(ISNULL(@strList,''))>0 )
 BEGIN
  IF ( LEN(ISNULL(@columnSplitChar,''))=0 )
  BEGIN  --列为空的情况
   IF ( LEN(ISNULL(@rowSplitChar,''))=0 )
   BEGIN
    -- 一行一列
    INSERT INTO @tempTable (A) VALUES(@strList)
   END
   ELSE
   BEGIN
    -- 多行一列
    SET @rowStart=1
    SET @rowEnd= CHARINDEX(@rowSplitChar,@strList,@rowStart)
    
    WHILE(@rowEnd>0 )
    BEGIN
     SET @strData =SUBSTRING(@strList,@rowStart,@rowEnd-@rowStart)
     INSERT INTO @tempTable (A) VALUES(@strData)
     
     SET @rowStart=@rowEnd+1
     SET @rowEnd= CHARINDEX(@rowSplitChar,@strList,@rowStart)
    END
    
    --最后行
    SET @strData =SUBSTRING(@strList,@rowStart,8000)
    INSERT INTO @tempTable (A) VALUES(@strData) 
   END
  END
  ELSE
  BEGIN --列不为空的情况
   IF ( LEN(ISNULL(@rowSplitChar,''))=0 )
   BEGIN
    --一行多列
    SET @colNo=1
    SET @colStart=1
    SET @colEnd= CHARINDEX(@columnSplitChar,@strList,@colStart)
    
    WHILE(@colEnd>0 OR @LastFlag>0 )
    BEGIN
     IF ( @colEnd>0 )
      SET @colData =SUBSTRING(@strList,@colStart,@colEnd-@colStart)
     ELSE
      SET @colData =SUBSTRING(@strList,@colStart,8000)
     IF ( @colNo=1 )
      SET @A=@colData
     ELSE IF ( @colNo=2 )
      SET @B=@colData
     ELSE IF ( @colNo=3 )
      SET @C=@colData
     ELSE IF ( @colNo=4 )
      SET @D=@colData
     ELSE IF ( @colNo=5 )
      SET @E=@colData
     ELSE IF ( @colNo=6 )
      SET @F=@colData
     ELSE IF ( @colNo=7 )
      SET @G=@colData
     ELSE IF ( @colNo=8 )
      SET @H=@colData
     ELSE IF ( @colNo=9 )
      SET @I=@colData
     ELSE IF ( @colNo=10 )
      SET @J=@colData 
     ELSE IF ( @colNo=11 )
      SET @K=@colData
     ELSE IF ( @colNo=12 )
      SET @L=@colData 
     ELSE IF ( @colNo=13 )
      SET @M=@colData
     ELSE IF ( @colNo=14 )
      SET @N=@colData 
     ELSE IF ( @colNo=15 )
      SET @O=@colData 
     
     IF ( @colEnd>0 )
     BEGIN
      SET @colNo=@colNo+1
      SET @colStart=@colEnd+1
      SET @colEnd= CHARINDEX(@columnSplitChar,@strList,@colStart)
     END
     ELSE
     BEGIN
      SET @LastFlag=0
     END
    END 
    INSERT INTO @tempTable VALUES(@A, @B, @C, @D,
           @E, @F, @G, @H,
           @I, @J, @K, @L,
           @M, @N, @O)
   END
   ELSE
   BEGIN
    --多行多列
    SET @rowStart=1
    SET @rowEnd= CHARINDEX(@rowSplitChar,@strList,@rowStart)
    
    WHILE(@rowEnd>0 OR @LastFlag>0)
    BEGIN
     IF ( @rowEnd>0 )
      SET @strData =SUBSTRING(@strList,@rowStart,@rowEnd-@rowStart)
     ELSE
      SET @strData =SUBSTRING(@strList,@rowStart,8000)
     
     --------------获取列开始
     SET @colNo=1
     SET @A =''
     SET @B =''
     SET @C =''
     SET @D =''
     SET @E =''
     SET @F =''
     SET @G =''
     SET @H =''
     SET @I =''
     SET @J =''
     SET @K =''
     SET @L =''
     SET @M =''
     SET @N =''
     SET @O =''
     
     SET @LastFlag2=1
     SET @colStart=1
     SET @colEnd= CHARINDEX(@columnSplitChar,@strData,@colStart)
     
     WHILE(@colEnd>0 OR @LastFlag2>0 )
     BEGIN
      IF ( @colEnd>0 )
       SET @colData =SUBSTRING(@strData,@colStart,@colEnd-@colStart)
      ELSE
       SET @colData =SUBSTRING(@strData,@colStart,8000)
      IF ( @colNo=1 )
       SET @A=@colData
      ELSE IF ( @colNo=2 )
       SET @B=@colData
      ELSE IF ( @colNo=3 )
       SET @C=@colData
      ELSE IF ( @colNo=4 )
       SET @D=@colData
      ELSE IF ( @colNo=5 )
       SET @E=@colData
      ELSE IF ( @colNo=6 )
       SET @F=@colData
      ELSE IF ( @colNo=7 )
       SET @G=@colData
      ELSE IF ( @colNo=8 )
       SET @H=@colData
      ELSE IF ( @colNo=9 )
       SET @I=@colData
      ELSE IF ( @colNo=10 )
       SET @J=@colData 
      ELSE IF ( @colNo=11 )
       SET @K=@colData
      ELSE IF ( @colNo=12 )
       SET @L=@colData 
      ELSE IF ( @colNo=13 )
       SET @M=@colData
      ELSE IF ( @colNo=14 )
       SET @N=@colData 
      ELSE IF ( @colNo=15 )
       SET @O=@colData  
       
      IF ( @colEnd>0 )
      BEGIN
       SET @colNo=@colNo+1
       SET @colStart=@colEnd+1
       SET @colEnd= CHARINDEX(@columnSplitChar,@strData,@colStart)
      END
      ELSE
      BEGIN
       SET @LastFlag2=0
      END
     END 
     INSERT INTO @tempTable VALUES(@A, @B, @C, @D,
            @E, @F, @G, @H,
            @I, @J, @K, @L,
            @M, @N, @O) 
     --------------获取列结束
     IF ( @rowEnd>0 )
     BEGIN
      SET @rowStart=@rowEnd+1
      SET @rowEnd= CHARINDEX(@rowSplitChar,@strList,@rowStart)
     END
     ELSE
     BEGIN
      SET @LastFlag=0
     END
    END
   END
  END
 END
 
 RETURN
END

sql server 将字符串分割成表函数 strsplitetotable的更多相关文章

  1. [转]在Sql Server中将字符串分割成表格数据示例

    本文转自:http://www.lmwlove.com/ac/ID718 比如我们有一个字符串 ) select @appName ='UserID=admin,Account=ABC' 然后我们要以 ...

  2. 1 SQL SERVER 实现字符串分割成table的方法

    CREATE FUNCTION [dbo].[fn_SplitStringToTable] ( @p_Input VARCHAR(MAX), @p_Delimeter CHAR() = ',' ) R ...

  3. oracle根据分隔符将字符串分割成数组函数

    --创建表类型 create or replace type mytype as table of number;--如果定义成varchar--CREATE OR REPLACE type myty ...

  4. SQL Server自定义字符串分割函数——Split

    我相信大部分人都碰到过,处理数据的时候,字段的值是以 ',' (逗号)分隔的形式,所以我也不能避免. 然后我才知道,sql 是没有类似于 C# 和 Javascript 这种分割字符串的方法.( Sp ...

  5. SQL server字符串分割成表-表分割为字符串

    SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ),)) )) as begin declare @i int set @SourceSql=rtri ...

  6. SQL Server 自定义字符串分割函数

    一.按指定符号分割字符串,返回分割后的元素个数,方法很简单,就是看字符串中存在多少个分隔符号,然后再加一,就是要求的结果(标量值函数)   create function Func_StrArrayL ...

  7. sql server数据字符串分割功能sql

    --分割字符串函数 create FUNCTION [dbo].[GetSplitStringValueInIndex] ( ), --要分割的字符串 ), --分隔符号 @index INT --取 ...

  8. SQL Server 分隔字符串函数实现

    在SQL Server中有时候也会遇到字符串进行分隔的需求.平时工作中常常遇到这样的需求,例如:人员数据表和人员爱好数据表,一条人员记录可以多多人员爱好记录,而往往人员和人员爱好在界面展示层要一并提交 ...

  9. SQL Server:字符串函数

    以下所有例子均Studnet表为例: 1. len():计算字符串长度 len()用来计算字符串的长度,每个中文汉字或英文字母都为一个长度 select sname, len(sname) from ...

随机推荐

  1. 部署 LAMP

    部署 LAMP https://help.aliyun.com/document_detail/50774.html?spm=a2c4g.11186623.6.773.Em8xVc 文档提供方:上海驻 ...

  2. GPS数据包格式及数据包解析

    GPS数据包解析 GPS数据包解析 目的 GPS数据类型及格式 数据格式 数据解释 解析代码 结构体定义 GPRMC解析函数 GPGGA解析函数 测试样例输出 gps数据包格式 gps数据解析 车联网 ...

  3. Python并发编程系列之常用概念剖析:并行 串行 并发 同步 异步 阻塞 非阻塞 进程 线程 协程

    1 引言 并发.并行.串行.同步.异步.阻塞.非阻塞.进程.线程.协程是并发编程中的常见概念,相似却也有却不尽相同,令人头痛,这一篇博文中我们来区分一下这些概念. 2 并发与并行 在解释并发与并行之前 ...

  4. [转载] 你所不知道的TIME_WAIT和CLOSE_WAIT

    前言 本文转载自 https://mp.weixin.qq.com/s/FrEfx_Yvv0fkLG97dMSTqw.很久前看到Vincent Bernat在博客中写了一遍关于TCP time-wai ...

  5. HTTP请求的GET与POST方式的区别

    Form中的get和post方法,在数据传输过程中分别对应了HTTP协议中的GET和POST方法.二者主要区别如下: 1)Get是用来从服务器上获得数据,而Post是用来向服务器上传递数据: 2)Ge ...

  6. [ 原创 ]学习笔记-Android中隐式Intent 的使用

    Android中Intent的使用分为显示Intent和隐式Intent 之前已经介绍过显示Intent的用法了,今天来介绍一下隐式Intent的用法. 当我们在使用一款软件时,如果需要从该软件内部开 ...

  7. requests爬取百度音乐

    使用requests爬取百度音乐,我想把当前热门歌手的音乐信息爬下来. 首先进行url分析,可以看到: 歌手网页: 薛之谦网页: 可以看到,似乎这些路劲的获取一切都很顺利,然后可以写代码: # -*- ...

  8. 凡信(超仿微信Android版)开源了,内有源码下载 -

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha 凡信(超仿微信Android版)开源了,内有源码下载 - IM Geek开发者社区-移动 ...

  9. 【set】【可持久化Trie】The 16th UESTC Programming Contest Preliminary K - Will the circle be broken

    题意:You are given an array A of N non-negative integers and an integer M. Find the number of pair(i,j ...

  10. 【初识】KMP算法入门

    举个例子 模式串S:a s d a s d a s d f a s d 匹配串T:a s d a s d f 如果使用朴素匹配算法—— 1 2 3 4 5 6  8 9 a s d a s d a s ...