Sql server 返回id并拆分逗号分隔值的SQL语句

Sql server 返回id并拆分逗号分隔值的SQL语句,sql-server,Sql Server,我有一个包含以下数据的表格: NodeId ExternalIds 50 601 56 700,701 如何编写拆分ExternalId列并返回以下结果的SQL语句: NodeId ExternalIds 50 601 56 700 56 701 我发现了很多用户定义的函数和过程,它们可以将字符串拆分成一个表,但我无法让它们中的任何一个正常工作 编辑 其中,SplitString基于以下内容: SET ANSI_NULLS ON GO SET QUOTED

我有一个包含以下数据的表格:

NodeId ExternalIds 50 601 56 700,701 如何编写拆分ExternalId列并返回以下结果的SQL语句:

NodeId ExternalIds 50 601 56 700 56 701
我发现了很多用户定义的函数和过程,它们可以将字符串拆分成一个表,但我无法让它们中的任何一个正常工作

编辑

其中,SplitString基于以下内容:

SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO Create FUNCTION [dbo].[SplitString] ( -- Add the parameters for the function here @myString varchar(500), @deliminator varchar(10) ) RETURNS @ReturnTable TABLE ( -- Add the column definitions for the TABLE variable here [id] [int] IDENTITY(1,1) NOT NULL, [part] [varchar](50) NULL ) AS BEGIN Declare @iSpaces int Declare @part varchar(50) --initialize spaces Select @iSpaces = charindex(@deliminator,@myString,0) While @iSpaces > 0 Begin Select @part = substring(@myString,0,charindex(@deliminator,@myString,0)) Insert Into @ReturnTable(part) Select @part Select @myString = substring(@mystring,charindex(@deliminator,@myString,0)+ len(@deliminator),len(@myString) - charindex(' ',@myString,0)) Select @iSpaces = charindex(@deliminator,@myString,0) end If len(@myString) > 0 Insert Into @ReturnTable Select @myString RETURN END 我正试图从数据库中获取一些有关Umbraco cms的数据,它是用逗号分隔的值设计的

谢谢
Thomas

下面是一个快速示例,说明如何将光标悬停在数据上,转换为所需格式。注意,这是一个快速演示,目前没有使用拆分功能。我想提出两点意见: -应避免使用imo游标 -作为 以上评论者建议尝试 避免存储分隔数据的步骤

DECLARE @Table TABLE
(
    NodeId int,
    ExternalID int
)
DECLARE @NodeId int
DECLARE @ExternalIds nvarchar(2000)

DECLARE db_cursor CURSOR FOR  
SELECT NodeId, ExternalIDs
from dbo.test

OPEN db_cursor   
FETCH NEXT FROM db_cursor INTO @NodeId, @ExternalIds   

WHILE @@FETCH_STATUS = 0   
BEGIN   
    WHILE (Charindex(',',@ExternalIds)>0)
    Begin
        INSERT INTO @Table (NodeId, ExternalId)
        SELECT @NodeId, 
            Data = ltrim(rtrim(Substring(@ExternalIds,1,Charindex(',',@ExternalIds)-1)))

        SET @externalids = Substring(@ExternalIds,Charindex(',',@ExternalIds)+1,len(@ExternalIds))
    End

    INSERT INTO @Table (NodeId, ExternalId)
    Select @NodeId, Data = ltrim(rtrim(@ExternalIds))

    FETCH NEXT FROM db_cursor INTO @NodeId, @ExternalIds  
END   

CLOSE db_cursor   
DEALLOCATE db_cursor

SELECT * FROM @Table

请说明当您尝试使这些函数工作时发生了什么。我发现了许多用户定义的函数和过程,它们可以将字符串拆分为一个表,但我无法使它们中的任何一个工作。您尝试过什么?也许您应该正确地设计数据库。数据几乎不应该存储在分隔列表中。@HLGEM。也许这是为了将数据迁移到1NF?Hi中的表。我用我现在的sqlHi Mikael更新了这个问题,我尝试了你的解决方案,但令我惊讶的是,我的一些值在最后一个字母表处被截断了;并以空格分隔。例如,我的产品名称为PS CAS;SECURITY SOURCEONE,应用fxn时,一列显示为SECURITY SOURCEON,末尾缺少“E”。有什么想法吗?TIA.@Nemo我想拆分字符串函数不能将空格作为分隔符处理。你用的和这里的问题一样吗?这不是很有效率。寻找替代方案。@Mikael-Ty获取信息。我去了你贴的链接。我想通过使用SQLCLR函数删除分号后的空格。所以我的专栏产品名称看起来像PS CAS;SECURITY SOURCEONE现在我关心的是如何为每个ID获取新行,这些ID的产品名称为PS CAS;不使用上述拆分字符串fxn的SECURITY SOURCEONE?我是SQLCLR新手,但它似乎擅长处理这些问题。不知道怎么办有什么帮助吗?@Nemo你应该把这个问题作为一个新的问题来问,让别人有机会回答,或者让你找到其他资源或其他问题,这些都是你需要的答案。谢谢你的建议。行。
select NodeId, 
       S.part
from #tmpTable
  cross apply [dbo].[SplitString](ExternalIds, ',') as S
DECLARE @Table TABLE
(
    NodeId int,
    ExternalID int
)
DECLARE @NodeId int
DECLARE @ExternalIds nvarchar(2000)

DECLARE db_cursor CURSOR FOR  
SELECT NodeId, ExternalIDs
from dbo.test

OPEN db_cursor   
FETCH NEXT FROM db_cursor INTO @NodeId, @ExternalIds   

WHILE @@FETCH_STATUS = 0   
BEGIN   
    WHILE (Charindex(',',@ExternalIds)>0)
    Begin
        INSERT INTO @Table (NodeId, ExternalId)
        SELECT @NodeId, 
            Data = ltrim(rtrim(Substring(@ExternalIds,1,Charindex(',',@ExternalIds)-1)))

        SET @externalids = Substring(@ExternalIds,Charindex(',',@ExternalIds)+1,len(@ExternalIds))
    End

    INSERT INTO @Table (NodeId, ExternalId)
    Select @NodeId, Data = ltrim(rtrim(@ExternalIds))

    FETCH NEXT FROM db_cursor INTO @NodeId, @ExternalIds  
END   

CLOSE db_cursor   
DEALLOCATE db_cursor

SELECT * FROM @Table