Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.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 2008 - Fatal编程技术网

Sql 两个级别的逗号分隔列中的表

Sql 两个级别的逗号分隔列中的表,sql,sql-server-2008,Sql,Sql Server 2008,我有一个旧数据库,其中有两列包含逗号分隔的值,如下所示 现在我的问题是,我试图将这些值导入到另一个规范化的数据库中。因此,我需要将这些值转换为表格格式,而不是逗号分隔的值 所以我的输出应该是这样的 您需要定义这些列的含义。在您的示例中,您是否丢弃原始ID列,在这种情况下,1,2,3&A,B实际上是什么意思 我可能会通过对每一行进行光标扫描并使用split函数将每个字段转换为一个值表来实现这一点 create FUNCTION dbo.fn_Split1 (@sep nchar(1), @s n

我有一个旧数据库,其中有两列包含逗号分隔的值,如下所示

现在我的问题是,我试图将这些值导入到另一个规范化的数据库中。因此,我需要将这些值转换为表格格式,而不是逗号分隔的值

所以我的输出应该是这样的


您需要定义这些列的含义。在您的示例中,您是否丢弃原始ID列,在这种情况下,1,2,3&A,B实际上是什么意思

我可能会通过对每一行进行光标扫描并使用split函数将每个字段转换为一个值表来实现这一点

create FUNCTION dbo.fn_Split1 (@sep nchar(1), @s nvarchar(4000))
RETURNS table
/**************************************************************************************************
 * Author:              http://stackoverflow.com/questions/314824/
 * Description:         splits a string into a table of values, with single-char delimiter.
 * Example Usage:

        select * from dbo.fn_split1(',', '1,2,5,2,,dggsfdsg,456,df,1,2,5,2,,dggsfdsg,456,df,1,2,5,2,,')
 **************************************************************************************************/
AS
RETURN (
    WITH Pieces(pn, start, stop) AS (
      SELECT 1, 1, CHARINDEX(@sep, @s)
      UNION ALL
      SELECT pn + 1, stop + 1, CHARINDEX(@sep, @s, stop + 1)
      FROM Pieces
      WHERE stop > 0
    )
    SELECT pn,
      SUBSTRING(@s, start, CASE WHEN stop > 0 THEN stop-start ELSE 4000 END) AS s
    FROM Pieces
  )

你的回答与我的要求或预期结果不符。可能是我的错误,我不能给出一个确切的问题。好的,试着从ID=1的示例数据的第一行详细描述您想要什么。我自己使用UDF完成了这项工作。我已经发布了这个答案,因为这是不可能的评论。谢谢你的时间和支持。
CREATE TABLE #RegionDetail
 (
   Id int identity(1,1) not null,
   RegionId nvarchar(50),
   Zone nvarchar(50) 
 )

INSERT INTO #RegionDetail (RegionId,Zone) values ('1,2,3','A,B')
INSERT INTO #RegionDetail (RegionId,Zone) values ('1,2,3','X,Y')
INSERT INTO #RegionDetail (RegionId,Zone) values ('4,3,5','A,B')

GO

create FUNCTION [dbo].[Split](@String varchar(MAX), @Delimiter char(1))       
returns @temptable TABLE (items varchar(MAX))       
as       
begin      
    declare @idx int       
    declare @slice varchar(8000)       

    select @idx = 1       
        if len(@String)<1 or @String is null  return       

    while @idx!= 0       
    begin       
        set @idx = charindex(@Delimiter,@String)       
        if @idx!=0       
            set @slice = left(@String,@idx - 1)       
        else       
            set @slice = @String       

        if(len(@slice)>0)  
            insert into @temptable(Items) values(@slice)       

        set @String = right(@String,len(@String) - @idx)       
        if len(@String) = 0 break       
    end   
return 
end;

GO 

SELECT Id,RegionId,Zone FROM #RegionDetail

select 
   r.Id,f.items as RegionId,z.items as Zone
from 
    #RegionDetail r
    cross apply [dbo].[Split](r.RegionId,',') f
    cross apply [dbo].[Split](r.Zone,',') z
order by Id,RegionId,Zone