博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SQLSERVER拆分字符串的函数(表值函数)
阅读量:6851 次
发布时间:2019-06-26

本文共 1880 字,大约阅读时间需要 6 分钟。

--
 =============================================
--
 Author:        <over>
--
 Create date: <2007/09/19>
--
 Description:    <string.split()拆分字符串>
--
 =============================================
ALTER
 
FUNCTION
 
[
dbo
]
.
[
Split
]
    (
        
@string
 
varchar
(
255
),        
--
1,2,3,45,
        
@separator
 
char
=
'
,
'
    )
RETURNS
 
@temp
 
TABLE
 
(
    Item 
int
)
AS
 
BEGIN
    
DECLARE
 
@Item
 
int
    
DECLARE
 
@CurrentIndex
  
int
    
DECLARE
 
@NextIndex
 
int
    
DECLARE
 
@Length
  
int
    
--
字符串的长度
    
SET
 
@CurrentIndex
=
1
    
SET
 
@Length
=
DATALENGTH
(
@string
)
    
    
IF
 
@string
 
IS
 
NOT
 
NULL
 
        
BEGIN
            
WHILE
 
@CurrentIndex
<
@Length
                
BEGIN
                    
--
CHARINDEX(子串,被搜索的字符串)
                    
SET
 
@NextIndex
=
CHARINDEX
(
@separator
,
@string
,
@CurrentIndex
)
                    
SET
 
@Item
=
SUBSTRING
(
@string
,
@CurrentIndex
,
@NextIndex
-
@CurrentIndex
)
                    
SET
 
@CurrentIndex
=
@NextIndex
+
1
                    
--
把临时变量的值放到要返回的表中
                    
INSERT
 
INTO
 
@temp
 
VALUES
(
@Item
)
                
END
        
END
    
RETURN
END

调用代码:

--
 =============================================
--
 Author:        <over>
--
 Create date: <2007/09/19>
--
 Description:    <更新用户的角色(更改授权)>
--
 =============================================
ALTER
 
PROCEDURE
 dbo.UpdUserRole
    
@UserID
 
INT
,                
--
这里没有做UserID的检查
    
@RoleIDs
 
VARCHAR
(
255
)        
--
1,2,3,4,5
AS
    
SET
 NOCOUNT 
ON
 
    
    
--
单个权限值
    
DECLARE
 
@RoleID
 
INT
    
    
--
获得拆分之后的字符串
    
DECLARE
 Roles 
CURSOR
  
FOR
    
SELECT
 Item 
FROM
 
[
dbo
]
.
[
Split
]
(
@RoleIDs
,
default
)
    
--
for Read Only
    
    
--
删除原有权限
    
DELETE
 
FROM
 UserRoles 
WHERE
 UserID
=
@UserID
    
    
OPEN
 Roles
    
    
FETCH
 Roles 
INTO
 
@RoleID
        
WHILE
(
@@FETCH_STATUS
=
0
)
            
BEGIN
                
--
SELECT UserID FROM UserRoles WHERE UserID=@UserID AND RoleID=@RoleID
                
--
if @@rowcount=0
                
INSERT
 
INTO
 UserRoles 
VALUES
(
@UserID
,
@RoleID
)
                
--
把下一个值塞给变量@RoleID
                
FETCH
 
NEXT
 
FROM
 Roles
                
INTO
 
@RoleID
            
END
            
    
CLOSE
 Roles
    
--
DEALLOCATE 用于删除前面准备好的查询。 
    
--
如果你没有明确 DEALLOCATE 一个准备好的查询, 那么它在会话结束的时候删除。 
    
DEALLOCATE
 Roles  
    
--
RETURN

注意:

此函数在SQLSERVER2005存储过程中调用没有问题,如果需要移植到SQLSERVER2000下,只需把:

@separator
 
char
=
'
,
'
换成

@separator
 
char
(
1
)
=
'
,
'

可参考曾发过的一篇文章。

本文转自博客园农民伯伯的博客,原文链接:,如需转载请自行联系原博主。

你可能感兴趣的文章
你真的了解UITableViewCell重用吗?
查看>>
httpd-2.2 配置及用法完全攻略
查看>>
Mininet 跑一个简单的ping测试
查看>>
异常处理的解决方案 OneTrueError
查看>>
QSignalMapper类处理多信号关联同一个槽的方法(2)
查看>>
BZOJ1931 : [Shoi2007]Permutation 有序的计数
查看>>
牛客网java基础知识
查看>>
Nginx的端口修改问题
查看>>
vmware里面的名词 vSphere、vCenter Server、ESXI、vSphere Client
查看>>
使用Delaunay三角剖分解决求多边形面积的问题
查看>>
过大年
查看>>
Android Asynchronous Http Client 中文教程
查看>>
带你从零学ReactNative开发跨平台App开发[expo 打包发布](八)
查看>>
Redis系列-存储篇hash主要操作函数小结
查看>>
pycharm如何设置python版本、设置国内pip镜像、添加第三方类库
查看>>
hibernate之关于一对多单向关联映射
查看>>
mysql group by 与order by的实例分析(mysql分组统计后最大值)
查看>>
SpringBoot集成RabbitMQ并实现消息确认机制
查看>>
默认网关 网关 子网掩码 广播地址
查看>>
一文看懂 NLP 神经网络发展历史中最重要的 8 个里程碑
查看>>