Sql server 2008 将字符串转换为逗号分隔的值

Sql server 2008 将字符串转换为逗号分隔的值,sql-server-2008,Sql Server 2008,我有一张如下的桌子 DECLARE @T TABLE(Data VARCHAR(MAX)) INSERT INTO @T SELECT 'SQL' UNION ALL SELECT 'JOB' 需要如下输出,但不使用任何自定义项 Data String ------------ SQL S,Q,L JOB J,O,B 请在这方面帮助我当然可以:)。你也可以把它缩短 DECLARE @T TABLE(Data VARCHAR(MAX)) INSERT INTO @T SELECT '

我有一张如下的桌子

DECLARE @T TABLE(Data VARCHAR(MAX))
INSERT INTO @T
SELECT 'SQL' UNION ALL SELECT 'JOB'
需要如下输出,但不使用任何自定义项

Data  String
------------
SQL   S,Q,L
JOB   J,O,B
请在这方面帮助我

当然可以:)。你也可以把它缩短

DECLARE @T TABLE(Data VARCHAR(MAX))
INSERT INTO @T
SELECT 'SQL' UNION ALL SELECT 'JOB';    

With cte as
(
    Select Data, Len(Data) DataLength, 1 level
    From @t
    Union All 
    Select Data, DataLength - 1, level + 1
    From cte
    Where DataLength > 1 
),
cte2 as
(
    Select Data, SUBSTRING(Data, DataLength, 1) DataLetter, level
    From cte
),
cte3 as
(
    Select Data, 
        (
            SELECT DataLetter + ','
            FROM cte2 c
            Where c.Data = cte2.Data
            Order By level desc
            FOR XML PATH(''), TYPE

        ).value('.[1]', 'NVARCHAR(1000)') DataComa
    From cte2
    Group By Data
)
Select Data, substring(DataComa, 1, Len(DataComa) - 1) Data2
From cte3
当然可以:)。你也可以把它缩短

DECLARE @T TABLE(Data VARCHAR(MAX))
INSERT INTO @T
SELECT 'SQL' UNION ALL SELECT 'JOB';    

With cte as
(
    Select Data, Len(Data) DataLength, 1 level
    From @t
    Union All 
    Select Data, DataLength - 1, level + 1
    From cte
    Where DataLength > 1 
),
cte2 as
(
    Select Data, SUBSTRING(Data, DataLength, 1) DataLetter, level
    From cte
),
cte3 as
(
    Select Data, 
        (
            SELECT DataLetter + ','
            FROM cte2 c
            Where c.Data = cte2.Data
            Order By level desc
            FOR XML PATH(''), TYPE

        ).value('.[1]', 'NVARCHAR(1000)') DataComa
    From cte2
    Group By Data
)
Select Data, substring(DataComa, 1, Len(DataComa) - 1) Data2
From cte3

使用UDF非常容易。 但是如果你想不使用UDF,我唯一能想到的方法就是

像这样的

DECLARE @T TABLE(Data VARCHAR(MAX))
INSERT INTO @T
SELECT 'SQL' UNION ALL SELECT 'JOB'

select replace(replace(replace(data,'S','S,'),'Q','Q,'),'L','L,') from @T

在这里,您必须用replace函数替换所有26个字符。例如,“A”和“A”,“B”和“B”…'“Z”与“Z”一起使用,

使用UDF非常容易。 但是如果你想不使用UDF,我唯一能想到的方法就是

像这样的

DECLARE @T TABLE(Data VARCHAR(MAX))
INSERT INTO @T
SELECT 'SQL' UNION ALL SELECT 'JOB'

select replace(replace(replace(data,'S','S,'),'Q','Q,'),'L','L,') from @T

在这里,您必须用replace函数替换所有26个字符。例如,“A”和“A”,“B”和“B”…'Z'与'Z',

使用与我在这里用于Initcap函数相同的方法


使用我在这里用于Initcap函数的相同方法


派对迟到了,但这里有一个略短的版本:

DECLARE @T TABLE(Data VARCHAR(MAX));

INSERT INTO @T VALUES('SQL'),('JOB'),('FLOOB');

;WITH n AS (SELECT TOP (SELECT MAX(LEN(Data)) FROM @T) 
  n = ROW_NUMBER() OVER (ORDER BY [object_id]) FROM sys.all_objects
),
t AS (SELECT n, Data, Letter = SUBSTRING(t.Data, n.n, 1) FROM n
  INNER JOIN @T AS t ON SUBSTRING(t.Data, n.n, 1) > ''
)
SELECT Data, STUFF((SELECT ',' + letter FROM t AS t2
  WHERE t2.Data = t.Data ORDER BY t2.n FOR XML PATH(''), 
  TYPE).value('.[1]', 'varchar(max)'), 1, 1, '')
FROM t GROUP BY Data;
结果:

FLOOB   F,L,O,O,B
JOB     J,O,B
SQL     S,Q,L

派对迟到了,但这里有一个略短的版本:

DECLARE @T TABLE(Data VARCHAR(MAX));

INSERT INTO @T VALUES('SQL'),('JOB'),('FLOOB');

;WITH n AS (SELECT TOP (SELECT MAX(LEN(Data)) FROM @T) 
  n = ROW_NUMBER() OVER (ORDER BY [object_id]) FROM sys.all_objects
),
t AS (SELECT n, Data, Letter = SUBSTRING(t.Data, n.n, 1) FROM n
  INNER JOIN @T AS t ON SUBSTRING(t.Data, n.n, 1) > ''
)
SELECT Data, STUFF((SELECT ',' + letter FROM t AS t2
  WHERE t2.Data = t.Data ORDER BY t2.n FOR XML PATH(''), 
  TYPE).value('.[1]', 'varchar(max)'), 1, 1, '')
FROM t GROUP BY Data;
结果:

FLOOB   F,L,O,O,B
JOB     J,O,B
SQL     S,Q,L

创建一个标量值函数,该函数接受字符串并返回带有“,”的字符串,我需要它,而不使用任何用户定义的函数。您能解释为什么不能使用函数来完成它吗?我们可以使用函数来实现,但是不使用函数可以实现吗?创建一个接受字符串并返回带“,”的字符串的标量值函数,我需要它,而不使用任何用户定义的函数。你能解释为什么不能使用函数实现吗?我们可以使用函数实现,但不使用函数可以实现吗?