首页 > 解决方案 > 在 SQL Server 中使用“@”拆分

问题描述

当前结果:

Data
-----
1@2@3@4@5@6

预期结果:

Data1  Data2  Data3  Data4  Data5  Data6 
----------------------------------------
1      2      3      4      5      6

尝试使用SUBSTRING(), LEFT()CHARINDEX()但没有帮助。

谁能告诉我,我错过了什么?

标签: sql-serversplitcharsubstring

解决方案


尝试:

DECLARE @Var NVARCHAR(MAX)

SET @Var ='1@2@3@4@5@6'

DECLARE @XML AS XML

DECLARE @Delimiter AS CHAR(1) ='@'

SET @XML = CAST(('<X>'+REPLACE(@Var,@Delimiter ,'</X><X>')+'</X>') AS XML)

DECLARE @temp TABLE (ID INT,name NVARCHAR(MAX))

INSERT INTO @temp

SELECT N.value('.', 'INT') AS ID, 'data' + CONVERT(Nvarchar,N.value('.', 'INT')) as name 
FROM @XML.nodes('X') AS T(N)

SELECT *
FROM @temp
PIVOT
(
  MAX(id)
  FOR name IN ([data1],[data2],[data3],[data4],[data5],[data6])
) PIV;

结果:

data1   data2   data3   data4   data5   data6
1        2       3       4        5       6

使用动态 SQL:

SELECT *
INTO ##temp 
FROM @temp

DECLARE @cols AS NVARCHAR(MAX),
        @query  AS NVARCHAR(MAX)

SELECT @cols = STUFF((SELECT ',' + QUOTENAME(name) 
                    from @temp
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

SET @query = N'SELECT * 
            FROM 
            ##temp
            PIVOT 
            (
                MAX(id)
                FOR name IN (' + @cols + N')
            ) PIV'

EXEC(@query)

DROP TABLE ##temp

推荐阅读