未完成的存储过程:使用函数/存储过程实现动态的一行数据转多行数据

有如下结构表table

ID                     Name
Type:type2:type3    XXX

需要查询出 TypeID  in (typex1,typex2,typex3)的数据

由于表中存储的ID本就是乱序存放了n个ID,所以尝试使用函数/存储过程实现动态的一行数据转多行数据

下为实现:

exec dbo.[Proc_SplitStr] ':','SELECT [ID],[Name] FROM  [table]','Type'

  alter proc [dbo].[Proc_SplitStr]
(    
    @split nvarchar(100) ,  --分隔符号
    @sql nvarchar(2000),   --sql
    @whereSql nvarchar(200)
)
AS
begin
     declare @temp TABLE(splitResult NVARCHAR(100),value nvarchar(100))
     declare @CURSOR_sql nvarchar(1000)
     set @CURSOR_sql = 'DECLARE MyCursor CURSOR for '+@sql
    exec sp_executesql @CURSOR_sql  
    OPEN MyCursor   
    DECLARE @originalStr nvarchar(2000),@zValue nvarchar(100);  --要分割的字符串 --值字段
    FETCH NEXT FROM MyCursor INTO @originalStr,@zValue   --//移动游标指向到第一条数据,提取第一条数据存放在变量中 
    WHILE @@FETCH_STATUS =0
    BEGIN 
     DECLARE @result AS VARCHAR(100);  
        SET @originalStr = @originalStr + @split ;  
        WHILE (@originalStr <> '')
            BEGIN
                SET @result = LEFT(@originalStr, CHARINDEX(@split, @originalStr, 1) -1) ;
                INSERT @temp VALUES(@result,@zValue) ;  
                --STUFF()函数用于删除指定长度的字符,并可以在指定的起点处插入另一组字符。
                SET @originalStr = STUFF(@originalStr, 1, CHARINDEX(@split, @originalStr, 1), '');
            END  
    FETCH NEXT FROM MyCursor INTO @originalStr,@zValue  
    END 
    CLOSE MyCursor 
    DEALLOCATE MyCursor 
    select splitResult,value from @temp where splitResult in (@whereSql)
END

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值