sql将字符串拆分为一行
我想在SQLServer2008中使用一个sql语句来表示一行六列sql将字符串拆分为一行,sql,sql-server,string,sql-server-2008,Sql,Sql Server,String,Sql Server 2008,我想在SQLServer2008中使用一个sql语句来表示一行六列 declare @sqlstr varchar(max); select @sqlstr = 'a,b,c,d,e,f'; 试试这个: a,b,c,d,e,f 试试这个: a,b,c,d,e,f 如果可以将其声明为nvarcharMAX而不是varcharmax,那么可以尝试将其转换为动态sql。例如: declare @str varchar(10)='a,b,c,d,e,f' ;WITH cte AS (
declare @sqlstr varchar(max);
select @sqlstr = 'a,b,c,d,e,f';
试试这个:
a,b,c,d,e,f
试试这个:
a,b,c,d,e,f
如果可以将其声明为nvarcharMAX而不是varcharmax,那么可以尝试将其转换为动态sql。例如:
declare @str varchar(10)='a,b,c,d,e,f'
;WITH cte AS (
SELECT CAST('<r>'+REPLACE(@str,',','</r><r>')+'</r>' AS XML).query('/r[1]').value('.','varchar(max)') col1,
CAST('<r>'+REPLACE(@str,',','</r><r>')+'</r>' AS XML).query('/r[2]').value('.','varchar(max)') col2,
CAST('<r>'+REPLACE(@str,',','</r><r>')+'</r>' AS XML).query('/r[3]').value('.','varchar(max)') col3,
CAST('<r>'+REPLACE(@str,',','</r><r>')+'</r>' AS XML).query('/r[4]').value('.','varchar(max)') col4,
CAST('<r>'+REPLACE(@str,',','</r><r>')+'</r>' AS XML).query('/r[5]').value('.','varchar(max)') col5,
CAST('<r>'+REPLACE(@str,',','</r><r>')+'</r>' AS XML).query('/r[6]').value('.','varchar(max)') col6
)
SELECT
CASE WHEN col1 = '' THEN NULL ELSE col1 END col1,
CASE WHEN col2 = '' THEN NULL ELSE col2 END col2,
CASE WHEN col3 = '' THEN NULL ELSE col3 END col3,
CASE WHEN col4 = '' THEN NULL ELSE col4 END col4,
CASE WHEN col5 = '' THEN NULL ELSE col5 END col5,
CASE WHEN col6 = '' THEN NULL ELSE col6 END col6
FROM cte
也可以略加删节
declare @sqlstr nvarchar(max);
--Select the initial values
select @sqlstr = 'a,b,c,d,e,f';
--Replace the comma so the string becomes a','b','c','d','e','f
select @sqlstr = REPLACE(@sqlstr, ',', ''',''')
--Add select to the beginning and add leading and trailing ' around the select values
select @sqlstr = 'Select ''' + @sqlstr + ''''
--execute the dynamic sql of select 'a','b','c','d','e','f'
exec sp_executesql @sqlstr
或者如果你和VARCHARMAX有牵连
请参见示例如果可以将其声明为nvarcharMAX而不是varcharmax,则可以尝试将其转换为动态sql。例如:
declare @str varchar(10)='a,b,c,d,e,f'
;WITH cte AS (
SELECT CAST('<r>'+REPLACE(@str,',','</r><r>')+'</r>' AS XML).query('/r[1]').value('.','varchar(max)') col1,
CAST('<r>'+REPLACE(@str,',','</r><r>')+'</r>' AS XML).query('/r[2]').value('.','varchar(max)') col2,
CAST('<r>'+REPLACE(@str,',','</r><r>')+'</r>' AS XML).query('/r[3]').value('.','varchar(max)') col3,
CAST('<r>'+REPLACE(@str,',','</r><r>')+'</r>' AS XML).query('/r[4]').value('.','varchar(max)') col4,
CAST('<r>'+REPLACE(@str,',','</r><r>')+'</r>' AS XML).query('/r[5]').value('.','varchar(max)') col5,
CAST('<r>'+REPLACE(@str,',','</r><r>')+'</r>' AS XML).query('/r[6]').value('.','varchar(max)') col6
)
SELECT
CASE WHEN col1 = '' THEN NULL ELSE col1 END col1,
CASE WHEN col2 = '' THEN NULL ELSE col2 END col2,
CASE WHEN col3 = '' THEN NULL ELSE col3 END col3,
CASE WHEN col4 = '' THEN NULL ELSE col4 END col4,
CASE WHEN col5 = '' THEN NULL ELSE col5 END col5,
CASE WHEN col6 = '' THEN NULL ELSE col6 END col6
FROM cte
也可以略加删节
declare @sqlstr nvarchar(max);
--Select the initial values
select @sqlstr = 'a,b,c,d,e,f';
--Replace the comma so the string becomes a','b','c','d','e','f
select @sqlstr = REPLACE(@sqlstr, ',', ''',''')
--Add select to the beginning and add leading and trailing ' around the select values
select @sqlstr = 'Select ''' + @sqlstr + ''''
--execute the dynamic sql of select 'a','b','c','d','e','f'
exec sp_executesql @sqlstr
或者如果你和VARCHARMAX有牵连
请参见带有use CTE和PIVOT的示例My variant:
DECLARE @sqlstr VARCHAR(MAX)
--Select the initial values
SELECT @sqlstr = 'a,b,c,d,e,f';
--Build the sql statement
DECLARE @DynamicSQL NVARCHAR(MAX) = 'Select ''' + REPLACE(@sqlstr, ',', ''',''') + ''''
--execute the dynamic sql of select 'a','b','c','d','e','f'
EXEC sp_executesql @DynamicSQL
带有动态枢轴的变型:
declare @sqlstr varchar(max);
select @sqlstr = 'a,b,c,d,e,f';
WITH cte AS
(
SELECT 1 as pos, REPLACE(@sqlstr, ',', '') as sqlstr
UNION ALL
SELECT pos + 1 as pos, sqlstr
FROM cte WHERE pos + 0 < LEN(sqlstr)
)
SELECT *
FROM
(
SELECT pos, SUBSTRING(sqlstr, pos, 1) AS sqlstr
FROM cte
) x
PIVOT
(
MAX(sqlstr)
FOR pos IN ([1], [2], [3], [4], [5], [6])
) p
使用CTE和PIVOT的车型:
DECLARE @sqlstr VARCHAR(MAX)
--Select the initial values
SELECT @sqlstr = 'a,b,c,d,e,f';
--Build the sql statement
DECLARE @DynamicSQL NVARCHAR(MAX) = 'Select ''' + REPLACE(@sqlstr, ',', ''',''') + ''''
--execute the dynamic sql of select 'a','b','c','d','e','f'
EXEC sp_executesql @DynamicSQL
带有动态枢轴的变型:
declare @sqlstr varchar(max);
select @sqlstr = 'a,b,c,d,e,f';
WITH cte AS
(
SELECT 1 as pos, REPLACE(@sqlstr, ',', '') as sqlstr
UNION ALL
SELECT pos + 1 as pos, sqlstr
FROM cte WHERE pos + 0 < LEN(sqlstr)
)
SELECT *
FROM
(
SELECT pos, SUBSTRING(sqlstr, pos, 1) AS sqlstr
FROM cte
) x
PIVOT
(
MAX(sqlstr)
FOR pos IN ([1], [2], [3], [4], [5], [6])
) p
你能详细说明一下吗?你只是想用5个逗号分割一个字符串,还是它实际上更复杂?T-SQL并没有真正考虑到字符串处理。因此,除了使用Substring和Charindex将字符串解析为单个变量之外,没有其他简单的方法可以做到这一点。如果可能的话,尝试在将值输入T-SQL之前进行解析。您能详细说明一下吗?你只是想用5个逗号分割一个字符串,还是它实际上更复杂?T-SQL并没有真正考虑到字符串处理。因此,除了使用Substring和Charindex将字符串解析为单个变量之外,没有其他简单的方法可以做到这一点。如果可能,请在将值输入T-SQL之前尝试进行解析。