Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.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 server 2008 如何将值拆分为多行?_Sql Server 2008 - Fatal编程技术网

Sql server 2008 如何将值拆分为多行?

Sql server 2008 如何将值拆分为多行?,sql-server-2008,Sql Server 2008,我有一张这样的桌子 keytype keyvalue ---------------------------- type1 st1,st2,st3 -------------------------------- type2 ts1,ts2,ts3 type1 type2 ------------------------ st1 ts1 ----------------- st2 ts2 ------

我有一张这样的桌子

     keytype   keyvalue
----------------------------
     type1     st1,st2,st3
--------------------------------
      type2    ts1,ts2,ts3
    type1   type2
------------------------
    st1     ts1
-----------------
    st2     ts2
--------------------
    st3     ts3
我想像这样将数据插入一个临时表中

     keytype   keyvalue
----------------------------
     type1     st1,st2,st3
--------------------------------
      type2    ts1,ts2,ts3
    type1   type2
------------------------
    st1     ts1
-----------------
    st2     ts2
--------------------
    st3     ts3

我该怎么做。请告诉我。谢谢。您应该以关系方式存储此数据,而不是以CSV字符串形式存储多条数据。如果您无法修复设计,那么这里有一种方法可以修复,但它会做出一些假设:(a)您只需要两种类型(b)这些类型具有相同数量的逗号分隔值。如果有两行以上的数据,则扩展并不十分麻烦,但除非您想恢复到非常单调的动态SQL,否则您需要提前知道有多少行

首先,创建一个有序拆分函数:

CREATE FUNCTION [dbo].[SplitStrings_Ordered]
(
    @List       NVARCHAR(MAX),
    @Delimiter  NVARCHAR(255)
)
RETURNS TABLE
AS
    RETURN (SELECT [Index] = ROW_NUMBER() OVER (ORDER BY Number), Item 
    FROM (SELECT Number, Item = SUBSTRING(@List, Number, 
      CHARINDEX(@Delimiter, @List + @Delimiter, Number) - Number)
     FROM (SELECT ROW_NUMBER() OVER (ORDER BY s1.[object_id])
      FROM sys.all_objects AS s1 CROSS JOIN sys.all_objects AS s2) AS n(Number)
      WHERE Number <= CONVERT(INT, LEN(@List))
      AND SUBSTRING(@Delimiter + @List, Number, LEN(@Delimiter)) = @Delimiter
    ) AS y);
GO
您可以对源表连接两个使用交叉应用的CTE:

;WITH t1 AS 
(
  SELECT s.[Index], s.Item FROM @x AS x 
  CROSS APPLY dbo.SplitStrings_Ordered(x.keyvalue, ',') AS s 
  WHERE x.keytype = 'type1'
), t2 AS 
(
  SELECT s.[Index], s.Item FROM @x AS x 
  CROSS APPLY dbo.SplitStrings_Ordered(x.keyvalue, ',') AS s 
  WHERE x.keytype = 'type2'
)
-- INSERT #some_temp_table(columns)
SELECT type1 = t1.Item, type2 = t2.Item 
  FROM t1 INNER JOIN t2 ON t1.[Index] = t2.[Index]
  ORDER BY t1.[Index];

为什么要将JSON塞进一列?您是否只有2个键类型,或者这需要容纳任意数量的源行?当一个JSON字符串有3个项目,另一个有4个项目时,您希望发生什么?