split函数的修改,通过存储过程实现整表所有列的拆分

/*
一、首先创建数据库
*/
if exists(select 1 from sys.sysdatabases where name=‘web_1‘)
begin
  drop database web_1
end

create database web_1  
on PRIMARY
(  
    NAME = web,  
    FILENAME=‘E:\test\web.mdf‘,   --此路径必须存在才能建成功
    SIZE = 10,  
    MAXSIZE = UNLIMITED,  
    FILEGROWTH = 5  
)  
LOG ON
(  
    NAME=‘web_dat‘,  
    FILENAME=‘E:\test\web.ldf‘,  --此路径必须存在才能建成功
    SIZE =5MB,  
    MAXSIZE = 25MB,  
    FILEGROWTH =5MB  
)  
GO
/*
二、创建需要拆分数据的测试表
*/
Use web_1

if exists(select 1 from sys.sysobjects where name =‘test‘) --查看表是否存在
begin
 drop table test
end

create table test
(
id int identity(1,1),
name varchar(255)
)
alter table test add constraint PK_test_id primary key(id)

insert into test(name) values(‘aa,;bb,;cc,;dd‘)
insert into test(name) values(‘11,;22,;33,;444‘)

select * from test

/*
三、创建类型
*/
if exists(SELECT 1 FROM sys.types WHERE name = ‘LocationTableType‘) --确认某type是否存在
begin
    drop  TYPE LocationTableType
end

CREATE TYPE LocationTableType AS TABLE
(
    Input nvarchar(max),    
    Separator nvarchar(max) default ‘,‘,
    RemoveEmptyEntries bit  default 1
);
/*
四、创建存储过程
*/
if exists(select 1 from sys.sysobjects   where xtype =‘P‘ and name=‘SplitString‘)
begin
   drop procedure  [SplitString]
end

create  Procedure [dbo].[SplitString]  
(@TVP dbo.LocationTableType readonly) --传入表
as
begin
   declare @OrignalInput nvarchar(max)
   declare @Input nvarchar(max)   
   declare @Separator nvarchar(max)
   declare @RemoveEmptyEntries bit
   
   declare  @rev  table
   (
    OrignalInput nvarchar(max),
    DealName nvarchar(max)
   ) --定义一个表的类型,作为返回表
   
   declare Split_Cursor Cursor for
   select Input,Input,Separator,RemoveEmptyEntries from  @TVP --使用游标实现数据循环拆分
   
   open Split_Cursor
   fetch next from Split_Cursor into @OrignalInput,@Input,@Separator,@RemoveEmptyEntries--与上面的查询顺序一致
   while @@FETCH_STATUS=0
   begin
       --实际处理字符串
        declare @Index int, @Entry nvarchar(max)
        set @Index = charindex(@Separator,@Input)
        while (@Index>0)
        begin
            set @Entry=ltrim(rtrim(substring(@Input, 1, @Index-1)))
            
            if (@RemoveEmptyEntries=0) or (@RemoveEmptyEntries=1 and @Entry<>‘‘)
                begin
                    insert into @rev(OrignalInput,DealName)Values(@OrignalInput,@Entry)
                end

set @Input = substring(@Input, @Index+datalength(@Separator)/2, len(@Input))
            set @Index = charindex(@Separator, @Input)
        end
        
        set @Entry=ltrim(rtrim(@Input))
        if (@RemoveEmptyEntries=0) or (@RemoveEmptyEntries=1 and @Entry<>‘‘)
            begin
                insert into @rev(OrignalInput,DealName)Values(@OrignalInput,@Entry)
            end
        
        fetch next from Split_Cursor into @OrignalInput,@Input,@Separator,@RemoveEmptyEntries
    end
    select * from @rev  --显示结果
    close Split_Cursor --关闭游标
    deallocate Split_Cursor    --释放资源
end
 
/*
五、调用存储过程实现拆分
*/

DECLARE @LocationTVP  AS LocationTableType;

INSERT INTO @LocationTVP (Input, Separator,RemoveEmptyEntries)
select name,‘,;‘,1 from test --将实表的数据插入到类型中

EXEC [SplitString] @LocationTVP

/*
六、说明

此处的返回表不是实体表,若是不止需要拆分列的内容,可以将表改为实体表,里面有个拆分前的数据列,可以用来与原表关联
*/

/*
七、删除测试
*/

drop procedure SplitString

drop  TYPE LocationTableType

drop table test

时间: 2024-10-06 11:15:47

split函数的修改,通过存储过程实现整表所有列的拆分的相关文章

SqlSever基础 设计-修改数据库中的一个表的列属性

JavaScript中split函数

JavaScript中split函数方法是将一个字符串分割为子字符串,然后将结果作为字符串数组返回.使用方法: stringObj.split( [separator[, limit]]) 其中stringObj是必选项.要被分解的 String 对象或文字.该对象不会被 split 方法修改. separator是可选项.字符串或 正则表达式 对象,它标识了分隔字符串时使用的是一个还是多个字符.如果忽略该选项,返回包含整个字符串的单一元素数组. limit是可选项.该值用来限制返回数组中的元素

oracle pl/sql split函数

在软件开发过程中程序员经常会遇到字符串的拼接和拆分工作. 以java开发为例: 前台传入字符串拼接形式的一个JSON数据,如:"1001,1002,1003",这可能代表了一组序号. 程序员需要将序号转名称后按照相同的格式输出,如:“张三.李四.王五”. Java程序员通用的做法是在service层将接收的"1001,1002,1003"拆分(使用java split函数),然后封装List,将List传递给DAO, 再传递给ORM持久层的xml调用sql执行,sq

js中的join(),reverse()与 split()函数用法解析

<script> /* * 1:arrayObject.reverse() * 注意: 该方法会改变原来的数组,而不会创建新的数组. * 2:arrayObject.join() * 注意:join() 方法用于把数组中的所有元素放入一个字符串. * 元素是通过指定的分隔符进行分隔的. * 指定分隔符方法join("#");其中#可以是任意 * 3:stringObject.split(a,b)这是它的语法 * 方法:用于把一个字符串分割成字符串数组. * a是必须的决定个

split函数

Python中有split()和os.path.split()两个函数,具体作用如下:split():拆分字符串.通过指定分隔符对字符串进行切片,并返回分割后的字符串列表(list)os.path.split():按照路径将文件名和路径分割开 一.函数说明1.split()函数 语法:str.split(str="",num=string.count(str))[n] 参数说明:str:   表示为分隔符,默认为空格,但是不能为空('').若字符串中没有分隔符,则把整个字符串作为列表的

python中join和split函数

一个是分割,一个是连接. 惯例,先看内部帮助文档 Help on method_descriptor: join(...) S.join(iterable) -> string Return a string which is the concatenation of the strings in the iterable. The separator between elements is S. (END) 将可迭代对象(包含的应该是str类型的,不然会报错)连接起来, 返回值是str,用法如

perl:split函数用法

本文和大家重点讨论一下Perl split函数的用法,Perl中的一个非常有用的函数是Perl split函数-把字符串进行分割并把分割后的结果放入数组中.这个Perl split函数使用规则表达式(RE),如果未特定则工作在$_变量上. Perl split函数 Perl中的一个非常有用的函数是Perl split函数-把字符串进行分割并把分割后的结果放入数组中.这个Perl split函数使用规则表达式(RE),如果未特定则工作在$_变量上. Perl split函数可以这样使用: $inf

SQL中实现SPLIT函数几种方法

例1 代码如下 复制代码 create function f_split(@SourceSql varchar(8000),@StrSeprate varchar(10))returns @temp table(a varchar(100))--实现split功能 的函数--date :2003-10-14as begin declare @i int set @SourceSql=rtrim(ltrim(@SourceSql)) set @i=charindex(@StrSeprate,@So

awk中split函数的用法

The awk function split(s,a,sep) splits a string s into an awk array a using the delimiter sep. time=12:34:56 echo $time | awk '{split($0,a,":" ); print a[1]}' 12   echo $time | awk '{split($0,a,":" ); print a[3]}' 34   echo $time | awk