zoukankan      html  css  js  c++  java
  • SQLSERVER拆分字符串的函数(表值函数)

    -- =============================================
    --
     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)=','

    可参考曾发过的一篇SQL SERVER2000 存储过程 设置传入参数默认值文章。

  • 相关阅读:
    Decoration4:分页展示
    Decoration3:增删改的实现
    Decoration2:引入Angularjs显示前台一条数据
    SqlServer 查看被锁的表和解除被锁的表
    Quarz.net 设置任务并行和任务串行
    第三方博客平台足迹
    Oracle PL/SQL Developer 上传下载Excel
    SSRS使用MySql作为数据源遇到的问题。
    "类工厂模式"改写SqlHelper
    Centos7 redis 5.0 服务设置、启动、停止、开机启动
  • 原文地址:https://www.cnblogs.com/over140/p/921070.html
Copyright © 2011-2022 走看看