有如下结构表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