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 ...
随机推荐
- js constructor 和 instanceof
说到这两个属性,那不得不说一下_proto_这个属性,通常这个属性是隐藏属性,是不允许被暴露的,而某些浏览器为了开发者能够很好的理解,而将这个属性暴露出来,比如Mozilla FireFox,这就是为 ...
- JAVAEE——宜立方商城12:购物车实现、订单确认页面展示
1. 学习计划 第十二天: 1.购物车实现 2.订单确认页面展示 2. 购物车的实现 2.1. 功能分析 1.购物车是一个独立的表现层工程. 2.添加购物车不要求登录.可以指定购买商品的数量. 3.展 ...
- gpfs中遇到的错误
主要导致这个问题是之前GPFS格式化的磁盘会留下gpfs的一些信息 mmcrnsd: Disk name nsd01 is already registered for use by GPFS.mmc ...
- python opencv3 矩形 圆形边框
git:https://github.com/linyi0604/Computer-Vision # coding:utf8 import cv2 import numpy as np # 读入图像 ...
- 【POJ】1419:Graph Coloring【普通图最大点独立集】【最大团】
Graph Coloring Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 5775 Accepted: 2678 ...
- CDOJ 1402 三角形棋盘上的博弈游戏 状压DP
三角形棋盘上的博弈游戏 题目连接: http://mozhu.today/#/problem/show/1402 Description 柱爷有天上课无聊,于是和同桌卿学姐一起下一种奇特的棋: 棋盘如 ...
- BZOJ 1007: [HNOI2008]水平可见直线 栈/计算几何
1007: [HNOI2008]水平可见直线 Time Limit: 1 Sec Memory Limit: 162 MB 题目连接 http://www.lydsy.com/JudgeOnline ...
- Codeforces Round #280 (Div. 2) D. Vanya and Computer Game 预处理
D. Vanya and Computer Game time limit per test 2 seconds memory limit per test 256 megabytes input s ...
- Alpha冲刺(1/10)——追光的人
1.队友信息 队员学号 队员博客 221600219 小墨 https://www.cnblogs.com/hengyumo/ 221600240 真·大能猫 https://www.cnblogs. ...
- .net mvc控制器传递方法到视图
很多人都是在视图里面定义方法,然后再使用.我个人也是这么干的.但是为了验证是否可以将方法从控制器传递到视图,所以做了个测试.结果真的可以.原理是利用了委托(delegate),因为委托本身就是一种类型 ...