Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.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 server SQL Server 2008行中的拆分和内部联接返回字符串_Sql Server_Sql Server 2008_Split_Inner Join - Fatal编程技术网

Sql server SQL Server 2008行中的拆分和内部联接返回字符串

Sql server SQL Server 2008行中的拆分和内部联接返回字符串,sql-server,sql-server-2008,split,inner-join,Sql Server,Sql Server 2008,Split,Inner Join,我有两张桌子: 表1 ID Name ------------ 1 Cpu 2 Vga 3 Ram 表2: ID Names ------------- 1 1;2 2 1;2;3 3 2 我想要结果:在表2中选择: ID Names Names string --

我有两张桌子:

表1

 ID    Name    
 ------------
  1    Cpu        
  2    Vga        
  3    Ram   
表2

 ID   Names      
 -------------
  1   1;2             
  2   1;2;3           
  3   2               
我想要结果:在表2中选择:

 ID    Names     Names string  
 ----------------------------
  1    1;2       Cpu,Vga         
  2    1;2;3     Cpu,Vga,Ram     
  3    2         Vga             
如何解决我的问题?多谢各位

;WITH cte AS (
SELECT * FROM Table1 t1
INNER JOIN (
    SELECT id AS t2_id, VALUE AS nameid
    FROM Table2 t2
    CROSS APPLY STRING_SPLIT(Names,';') 
    ) t3
ON t1.id=t3.nameid
) 
SELECT id ,
    STUFF((SELECT ','+ Name FROM cte c2 where c.id =c2.t2_id FOR XML PATH('')),1,1,'' ) 
    AS [Name String],

    STUFF ((SELECT ','+ cast(t2_id as varchar) from cte c2 
    WHERE c.id=c2.nameid FOR XML PATH('')),1,1,'' ) AS Names
FROM cte c
GROUP BY id 
输出

id    Name String    Names
1     Cpu,Vga         1,2
2     Cpu,Vga,Ram     1,2,3
3     Vga             2
注意

正如@plaidDK在评论中指出的

STRING\u SPLIT()
不是
SQL SERVER 2008
的函数,如果您找到一些存储过程来执行
STRING\u SPLIT()
的功能,上述查询将有所帮助。 并用存储过程名称替换
STRING\u SPLIT()

输出

id    Name String    Names
1     Cpu,Vga         1,2
2     Cpu,Vga,Ram     1,2,3
3     Vga             2
注意

正如@plaidDK在评论中指出的

STRING\u SPLIT()
不是
SQL SERVER 2008
的函数,如果您找到一些存储过程来执行
STRING\u SPLIT()
的功能,上述查询将有所帮助。
并用存储过程名称替换
STRING\u SPLIT()
,这里将为您解决这个问题

您需要创建一个函数,该函数可以拆分您的行,以便以后可以将它们连接起来,并使用som XML将您的行缩回

您需要创建一个可以拆分行或取消行的函数

    CREATE FUNCTION [dbo].[dba_parseString_udf] (
      @stringToParse VARCHAR(8000)  
    , @delimiter     CHAR(1)
)
RETURNS @parsedString TABLE (stringValue VARCHAR(128)) AS
BEGIN

/* Declare variables */
DECLARE @trimmedString  VARCHAR(8000);

/* We need to trim our string input in case the user entered extra spaces */
SET @trimmedString = LTRIM(RTRIM(@stringToParse));

/* Let's create a recursive CTE to break down our string for us */
WITH parseCTE (StartPos, EndPos)
AS
(
    SELECT 1 AS StartPos
        , CHARINDEX(@delimiter, @trimmedString + @delimiter) AS EndPos
    UNION ALL
    SELECT EndPos + 1 AS StartPos
        , CHARINDEX(@delimiter, @trimmedString + @delimiter , EndPos + 1) AS EndPos
    FROM parseCTE
    WHERE CHARINDEX(@delimiter, @trimmedString + @delimiter, EndPos + 1) <> 0
)

/* Let's take the results and stick it in a table */  
INSERT INTO @parsedString
SELECT SUBSTRING(@trimmedString, StartPos, EndPos - StartPos)
FROM parseCTE
WHERE LEN(LTRIM(RTRIM(SUBSTRING(@trimmedString, StartPos, EndPos - StartPos)))) > 0
OPTION (MaxRecursion 8000);

RETURN;   
END
结果

    CREATE FUNCTION [dbo].[dba_parseString_udf] (
      @stringToParse VARCHAR(8000)  
    , @delimiter     CHAR(1)
)
RETURNS @parsedString TABLE (stringValue VARCHAR(128)) AS
BEGIN

/* Declare variables */
DECLARE @trimmedString  VARCHAR(8000);

/* We need to trim our string input in case the user entered extra spaces */
SET @trimmedString = LTRIM(RTRIM(@stringToParse));

/* Let's create a recursive CTE to break down our string for us */
WITH parseCTE (StartPos, EndPos)
AS
(
    SELECT 1 AS StartPos
        , CHARINDEX(@delimiter, @trimmedString + @delimiter) AS EndPos
    UNION ALL
    SELECT EndPos + 1 AS StartPos
        , CHARINDEX(@delimiter, @trimmedString + @delimiter , EndPos + 1) AS EndPos
    FROM parseCTE
    WHERE CHARINDEX(@delimiter, @trimmedString + @delimiter, EndPos + 1) <> 0
)

/* Let's take the results and stick it in a table */  
INSERT INTO @parsedString
SELECT SUBSTRING(@trimmedString, StartPos, EndPos - StartPos)
FROM parseCTE
WHERE LEN(LTRIM(RTRIM(SUBSTRING(@trimmedString, StartPos, EndPos - StartPos)))) > 0
OPTION (MaxRecursion 8000);

RETURN;   
END

这将为您带来好处

您需要创建一个函数,该函数可以拆分您的行,以便以后可以将它们连接起来,并使用som XML将您的行缩回

您需要创建一个可以拆分行或取消行的函数

    CREATE FUNCTION [dbo].[dba_parseString_udf] (
      @stringToParse VARCHAR(8000)  
    , @delimiter     CHAR(1)
)
RETURNS @parsedString TABLE (stringValue VARCHAR(128)) AS
BEGIN

/* Declare variables */
DECLARE @trimmedString  VARCHAR(8000);

/* We need to trim our string input in case the user entered extra spaces */
SET @trimmedString = LTRIM(RTRIM(@stringToParse));

/* Let's create a recursive CTE to break down our string for us */
WITH parseCTE (StartPos, EndPos)
AS
(
    SELECT 1 AS StartPos
        , CHARINDEX(@delimiter, @trimmedString + @delimiter) AS EndPos
    UNION ALL
    SELECT EndPos + 1 AS StartPos
        , CHARINDEX(@delimiter, @trimmedString + @delimiter , EndPos + 1) AS EndPos
    FROM parseCTE
    WHERE CHARINDEX(@delimiter, @trimmedString + @delimiter, EndPos + 1) <> 0
)

/* Let's take the results and stick it in a table */  
INSERT INTO @parsedString
SELECT SUBSTRING(@trimmedString, StartPos, EndPos - StartPos)
FROM parseCTE
WHERE LEN(LTRIM(RTRIM(SUBSTRING(@trimmedString, StartPos, EndPos - StartPos)))) > 0
OPTION (MaxRecursion 8000);

RETURN;   
END
结果

    CREATE FUNCTION [dbo].[dba_parseString_udf] (
      @stringToParse VARCHAR(8000)  
    , @delimiter     CHAR(1)
)
RETURNS @parsedString TABLE (stringValue VARCHAR(128)) AS
BEGIN

/* Declare variables */
DECLARE @trimmedString  VARCHAR(8000);

/* We need to trim our string input in case the user entered extra spaces */
SET @trimmedString = LTRIM(RTRIM(@stringToParse));

/* Let's create a recursive CTE to break down our string for us */
WITH parseCTE (StartPos, EndPos)
AS
(
    SELECT 1 AS StartPos
        , CHARINDEX(@delimiter, @trimmedString + @delimiter) AS EndPos
    UNION ALL
    SELECT EndPos + 1 AS StartPos
        , CHARINDEX(@delimiter, @trimmedString + @delimiter , EndPos + 1) AS EndPos
    FROM parseCTE
    WHERE CHARINDEX(@delimiter, @trimmedString + @delimiter, EndPos + 1) <> 0
)

/* Let's take the results and stick it in a table */  
INSERT INTO @parsedString
SELECT SUBSTRING(@trimmedString, StartPos, EndPos - StartPos)
FROM parseCTE
WHERE LEN(LTRIM(RTRIM(SUBSTRING(@trimmedString, StartPos, EndPos - StartPos)))) > 0
OPTION (MaxRecursion 8000);

RETURN;   
END

这些是您的实际表,还是精简的示例?这些是您的实际表,还是精简的示例?SQL Server中没有字符串拆分功能2008@plaidDK谢谢你的信息。可能他可以使用存储过程来执行
string\u split
的功能。感谢jophab,我将使用sql 2012^^^ string split不是sql Server中的函数2008@plaidDK谢谢你的信息。可能他可以使用存储过程来实现
string\u split
的功能。谢谢jophab,我将使用sql 2012^^^谢谢plaidDK,问题解决谢谢plaidDK,问题解决