Sql server SQL Server 2008行中的拆分和内部联接返回字符串
我有两张桌子: 表1Sql 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 --
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,问题解决