Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何基于逗号分隔的一列值创建行_Sql_Sql Server - Fatal编程技术网

Sql 如何基于逗号分隔的一列值创建行

Sql 如何基于逗号分隔的一列值创建行,sql,sql-server,Sql,Sql Server,在SQL Server 2016+中,您可以使用字符串分割 在2016年之前的SQL Server中,使用Jeff Moden提供的CSV拆分器表值函数: Begin tran create table #user_det (user_id varchar(50), emp_id int, role varchar(500)) insert into #user_det (user_id , emp_id , role) select 'Sankar', 4315

在SQL Server 2016+中,您可以使用字符串分割

在2016年之前的SQL Server中,使用Jeff Moden提供的CSV拆分器表值函数:

Begin tran

create table #user_det 
             (user_id varchar(50), emp_id int, role varchar(500))

insert into #user_det (user_id , emp_id , role)
select 'Sankar', 431544 , '(Developer),(DBA),(Designer)'
union all
select 'Gowri', 145721 , '(DBA),(Designer)'
union all
select 'Raja', 101010 , 'ALL'

select * from #user_det

drop table #user_det

Rollback




OutPut Required:
===============

select 'Sankar' as user_id ,431544 as emp_id ,'Developer' as Role
union all
select 'Sankar' as user_id ,431544 as emp_id ,'DBA' as Role
union all
select 'Sankar' as user_id ,431544 as emp_id ,'Designer' as Role
union all
select 'Gowri' as user_id ,145721 as emp_id ,'DBA' as Role
union all
select 'Gowri' as user_id ,145721 as emp_id ,'Designer' as Role
union all
select 'Raja' as user_id ,101010 as emp_id ,'ALL' as Role
+---------+--------+-----------+
| user_id | emp_id |   Role    |
+---------+--------+-----------+
| Sankar  | 431544 | Developer |
| Sankar  | 431544 | DBA       |
| Sankar  | 431544 | Designer  |
| Gowri   | 145721 | DBA       |
| Gowri   | 145721 | Designer  |
| Raja    | 101010 | ALL       |
+---------+--------+-----------+
rextester演示:

返回:

select user_id, emp_id, Role = replace(replace(s.Item,'(',''),')','')
from #user_det u
  cross apply dbo.delimitedsplit8K(u.role,',') s
拆分字符串引用:

Jeff Moden的delimitedsplit8K函数:

Begin tran

create table #user_det 
             (user_id varchar(50), emp_id int, role varchar(500))

insert into #user_det (user_id , emp_id , role)
select 'Sankar', 431544 , '(Developer),(DBA),(Designer)'
union all
select 'Gowri', 145721 , '(DBA),(Designer)'
union all
select 'Raja', 101010 , 'ALL'

select * from #user_det

drop table #user_det

Rollback




OutPut Required:
===============

select 'Sankar' as user_id ,431544 as emp_id ,'Developer' as Role
union all
select 'Sankar' as user_id ,431544 as emp_id ,'DBA' as Role
union all
select 'Sankar' as user_id ,431544 as emp_id ,'Designer' as Role
union all
select 'Gowri' as user_id ,145721 as emp_id ,'DBA' as Role
union all
select 'Gowri' as user_id ,145721 as emp_id ,'Designer' as Role
union all
select 'Raja' as user_id ,101010 as emp_id ,'ALL' as Role
+---------+--------+-----------+
| user_id | emp_id |   Role    |
+---------+--------+-----------+
| Sankar  | 431544 | Developer |
| Sankar  | 431544 | DBA       |
| Sankar  | 431544 | Designer  |
| Gowri   | 145721 | DBA       |
| Gowri   | 145721 | Designer  |
| Raja    | 101010 | ALL       |
+---------+--------+-----------+

每个人都应该有一个好的拆分/解析函数,就像SqlZim链接到的那样

如果您不想或不能使用UDF,这里有另一个选项

create function [dbo].[delimitedsplit8K] (
      @pstring varchar(8000)
    , @pdelimiter char(1)
  )
returns table with schemabinding as
 return
  with e1(N) as (
    select 1 union all select 1 union all select 1 union all 
    select 1 union all select 1 union all select 1 union all 
    select 1 union all select 1 union all select 1 union all select 1
  )
  , e2(N) as (select 1 from e1 a, e1 b)
  , e4(N) as (select 1 from e2 a, e2 b)
  , ctetally(N) as (
    select top (isnull(datalength(@pstring),0)) 
      row_number() over (order by (select null)) from e4
  )
  , ctestart(N1) as (
    select 1 union all
    select t.N+1 from ctetally t where substring(@pstring,t.N,1) = @pdelimiter
  )
  , ctelen(N1,L1) as (
    select s.N1,
      isnull(nullif(charindex(@pdelimiter,@pstring,s.N1),0)-s.N1,8000)
    from ctestart s
  )
 select itemnumber = row_number() over(order by l.N1)
      , item       = substring(@pstring, l.N1, l.L1)
   from ctelen l
;
go
返回


你好,谢谢你的回答。但我需要在SQLServer2012版本中使用它。你能帮忙吗me@SankarM这适用于sql server 2012。如果你在2016年,这张便条是为另一个选择而写的。好的,明白了。非常感谢。有没有可能在不使用该函数的情况下写入单个查询?@SankarM,您应该使用它