Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.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将字符串拆分为一行_Sql_Sql Server_String_Sql Server 2008 - Fatal编程技术网

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 (

我想在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 (
         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之前尝试进行解析。