Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.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_Sql Server 2008 - Fatal编程技术网

如何为此结果编写SQL查询?

如何为此结果编写SQL查询?,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我有这么多长的数据库,所以我使用逗号分隔seq_no,在单个列中使用多个序列存储,但现在我希望所有序列都在单个列中,所以我不知道如何为此创建此sql结果 例如: TABLE STRUCTURE SR_NO IS INT , SEQ_NO IS VARCHAR(MAX) 我需要得到这个结果: SEQ_NO -------------- 1839073 1850097 1850098 1850099 1850100 1850110 谢谢 我在引用后编写了以下查询 它会对你有用的 create

我有这么多长的数据库,所以我使用逗号分隔seq_no,在单个列中使用多个序列存储,但现在我希望所有序列都在单个列中,所以我不知道如何为此创建此sql结果

例如:

TABLE STRUCTURE SR_NO IS INT , SEQ_NO IS VARCHAR(MAX) 我需要得到这个结果:

SEQ_NO 
--------------
1839073
1850097
1850098
1850099
1850100
1850110 

谢谢

我在引用后编写了以下查询

它会对你有用的

create table STRUCTURE(SR_NO int, SEQ_NO varchar(max))
insert STRUCTURE select 1, '1839073,'
insert STRUCTURE select 2, '1850097,1850098,'
insert STRUCTURE select 3, '1850099,1850100,1850110'


;with tmp(SR_NO, DataItem, SEQ_NO) as (
select SR_NO, LEFT(SEQ_NO, CHARINDEX(',',SEQ_NO+',')-1),
STUFF(SEQ_NO, 1, CHARINDEX(',',SEQ_NO+','), '')
from STRUCTURE
union all
select SR_NO, LEFT(SEQ_NO, CHARINDEX(',',SEQ_NO+',')-1),
STUFF(SEQ_NO, 1, CHARINDEX(',',SEQ_NO+','), '')
from tmp
where SEQ_NO > ''
)

Select DataItem as  SEQ_NO from tmp order by SEQ_NO;

尝试用XML拆分它

SELECT SR_NO, t.c.value('.', 'VARCHAR(2000)') COL1
FROM (
  SELECT SR_NO, x = CAST('<t>' + 
        REPLACE(SEQ_NO, ',', '</t><t>') + '</t>' AS XML) 
        FROM 
       (values(1,'1839073'),(2, '1850097,1850098'),
        (3, '1850099,1850100,1850110')) y(SR_NO, SEQ_NO)

) a
CROSS APPLY x.nodes('/t') t(c)
您可以将其替换为您的表:

 (values (1,'1839073'),(2, '1850097,1850098'),
  (3, '1850099,1850100,1850110')) y(SR_NO, SEQ_NO)

这应该可以做到:用表名替换表名

;WITH CTE(NEW_SEQ_NO, SEQ_NO) as (
SELECT LEFT(SEQ_NO, CHARINDEX(',',SEQ_NO + ',') -1),
    STUFF(SEQ_NO, 1, CHARINDEX(',',SEQ_NO + ','), '')
FROM YourTableName
WHERE SEQ_NO <> '' AND SEQ_NO IS NOT NULL 
UNION all
SELECT LEFT(SEQ_NO, CHARINDEX(',',SEQ_NO + ',') -1),
    STUFF(SEQ_NO, 1, CHARINDEX(',',SEQ_NO + ','), '')
FROM CTE
WHERE SEQ_NO <> '' AND SEQ_NO IS NOT NULL 
)

SELECT NEW_SEQ_NO from CTE ORDER BY NEW_SEQ_NO
有关详细信息,您可以查看此主题:

是否也要Sr\u No列?如果要Sr\u No列,是否保留值或重新编号?不,我不需要。我只是单列,所以你只是做了一个选择,而不是清理旧的,逗号分隔的值混乱?一句话的建议:不要这样做!不要将多个值存储到单个数据库单元中——这甚至违反了数据库设计的最基本的第一个标准形式——这将一次又一次地给您带来痛苦。别这么做,说真的!谢谢mohan,我通过给出这个逻辑来解决我的问题。再次感谢。
 (values (1,'1839073'),(2, '1850097,1850098'),
  (3, '1850099,1850100,1850110')) y(SR_NO, SEQ_NO)
;WITH CTE(NEW_SEQ_NO, SEQ_NO) as (
SELECT LEFT(SEQ_NO, CHARINDEX(',',SEQ_NO + ',') -1),
    STUFF(SEQ_NO, 1, CHARINDEX(',',SEQ_NO + ','), '')
FROM YourTableName
WHERE SEQ_NO <> '' AND SEQ_NO IS NOT NULL 
UNION all
SELECT LEFT(SEQ_NO, CHARINDEX(',',SEQ_NO + ',') -1),
    STUFF(SEQ_NO, 1, CHARINDEX(',',SEQ_NO + ','), '')
FROM CTE
WHERE SEQ_NO <> '' AND SEQ_NO IS NOT NULL 
)

SELECT NEW_SEQ_NO from CTE ORDER BY NEW_SEQ_NO
declare @t table(Id int,seq varchar(100)) 
insert into @t (Id,seq) values (1,'1839073,'),(2,'1839073,1850098,'),(3,'1850099,1850100,1850110 ')



;With Cte as (
SELECT A.Id,  
     Split.a.value('.', 'VARCHAR(100)') AS Seq  
 FROM  
 (
     SELECT Id,  
         CAST ('<M>' + REPLACE(seq, ',', '</M><M>') + '</M>' AS XML) AS Data  
     FROM  @t
 ) AS A CROSS APPLY Data.nodes ('/M') AS Split(a) )

 Select ID,Seq from Cte Where Seq > ''