sql server 将字符串分割成表函数 strsplitetotable
在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的更多相关文章
- [转]在Sql Server中将字符串分割成表格数据示例
本文转自:http://www.lmwlove.com/ac/ID718 比如我们有一个字符串 ) select @appName ='UserID=admin,Account=ABC' 然后我们要以 ...
- 1 SQL SERVER 实现字符串分割成table的方法
CREATE FUNCTION [dbo].[fn_SplitStringToTable] ( @p_Input VARCHAR(MAX), @p_Delimeter CHAR() = ',' ) R ...
- oracle根据分隔符将字符串分割成数组函数
--创建表类型 create or replace type mytype as table of number;--如果定义成varchar--CREATE OR REPLACE type myty ...
- SQL Server自定义字符串分割函数——Split
我相信大部分人都碰到过,处理数据的时候,字段的值是以 ',' (逗号)分隔的形式,所以我也不能避免. 然后我才知道,sql 是没有类似于 C# 和 Javascript 这种分割字符串的方法.( Sp ...
- SQL server字符串分割成表-表分割为字符串
SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ),)) )) as begin declare @i int set @SourceSql=rtri ...
- SQL Server 自定义字符串分割函数
一.按指定符号分割字符串,返回分割后的元素个数,方法很简单,就是看字符串中存在多少个分隔符号,然后再加一,就是要求的结果(标量值函数) create function Func_StrArrayL ...
- sql server数据字符串分割功能sql
--分割字符串函数 create FUNCTION [dbo].[GetSplitStringValueInIndex] ( ), --要分割的字符串 ), --分隔符号 @index INT --取 ...
- SQL Server 分隔字符串函数实现
在SQL Server中有时候也会遇到字符串进行分隔的需求.平时工作中常常遇到这样的需求,例如:人员数据表和人员爱好数据表,一条人员记录可以多多人员爱好记录,而往往人员和人员爱好在界面展示层要一并提交 ...
- SQL Server:字符串函数
以下所有例子均Studnet表为例: 1. len():计算字符串长度 len()用来计算字符串的长度,每个中文汉字或英文字母都为一个长度 select sname, len(sname) from ...
随机推荐
- CentOS7的一些指令
hostnamectl --static set-hostname yuanxu#永久修改主机名 systemctl stop firewalld.service #停止firewall system ...
- 2017-2018-1 20179202《Linux内核原理与分析》第九周作业
进程的切换和系统的一般执行过程 1.知识总结 (1)进程调度的时机: 中断处理过程直接调用schedule(),或者返回用户态时根据need_resched标记调用schedule(). 内核线程是一 ...
- Hadoop Hive概念学习系列之hive里的JDBC编程入门(二十二)
Hive与JDBC示例 在使用 JDBC 开发 Hive 程序时, 必须首先开启 Hive 的远程服务接口.在hive安装目录下的bin,使用下面命令进行开启: hive -service hives ...
- 【知了堂学习笔记】java web 简单的登录
最近皮皮潇在学习java web,刚接触了简单的东西,所以今天给大家带来一个简单的登录实现. 页面: 页面代码: <%@ page language="java" conte ...
- Spring boot集成Mybatis-Plus,通用Mapper
Mybatis-Plus(简称MP)是一个 Mybatis 的增强工具,在 Mybatis 的基础上只做增强不做改变,为简化开发.提高效率而生.(摘自mybatis-plus官网)Mybatis虽然已 ...
- luoguP3235 [HNOI2014]江南乐 数论分块 + 博弈论
感觉其实很水? 题目就是一个Multi SG游戏,只需要预处理出所有的\(sg\)值即可\(O(Tn)\)计算 对于计算\(sg[n]\)而言,显然我们可以枚举划分了\(x\)堆来查看后继状态 那么, ...
- luoguP5105 不强制在线的动态快速排序 [官方?]题解 线段树 / set
不强制在线的动态快速排序 题解 算法一 按照题意模拟 维护一个数组,每次直接往数组后面依次添加\([l, r]\) 每次查询时,暴力地\(sort\)查询即可 复杂度\(O(10^9 * q)\),期 ...
- [Luogu5105]不强制在线的动态快速排序
首先集合去重不影响答案,然后打表易得连续自然数平方差异或前缀和的规律,于是问题就变为在线维护区间求并同时更新答案,set记录所有区间,每次暴力插入删除即可.由于每个区间至多只会插入删除一次,故均摊复杂 ...
- Codeforces Round #350 (Div. 2) E. Correct Bracket Sequence Editor 栈 链表
E. Correct Bracket Sequence Editor 题目连接: http://www.codeforces.com/contest/670/problem/E Description ...
- UVALive 5968
假如出现SS 那么表示Spring,如果出现SX的话,就表示WINTER,末尾出现S不管 #include <map> #include <set> #include < ...