Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.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 将单行值拆分为多列的sql查询_Sql Server - Fatal编程技术网

Sql server 将单行值拆分为多列的sql查询

Sql server 将单行值拆分为多列的sql查询,sql-server,Sql Server,我正在处理sql serevr 2010中的现有审核表。 每行中都有以下字符串: "UserID: 4| GroupID: 1| GroupParentID: 1| GroupType: 1| RevisedBy: 4|" 从一排开始。 我的计划是创建以下格式的表: IDName IDs -------- ---------- UserID 4 GroupID 1 GroupParentID 1 GroupType 1

我正在处理sql serevr 2010中的现有审核表。 每行中都有以下字符串:

"UserID: 4| GroupID: 1| GroupParentID: 1| GroupType: 1| RevisedBy: 4|"
从一排开始。 我的计划是创建以下格式的表:

IDName        IDs
--------      ----------
UserID          4
GroupID         1
GroupParentID   1
GroupType       1
RevisedBy       4
最后,我创建了如下内容:(使用主表引用ID)

希望这是有意义的。 请让我知道如何以高性能实现这一点,因为该表有一百万行

谢谢

我使用拆分函数来分隔管道“|”

CREATE FUNCTION dbo.SplitStrings_XML1
(
   @List       NVARCHAR(MAX),
   @Delimiter  NVARCHAR(255)
)
RETURNS TABLE
WITH SCHEMABINDING
AS
RETURN 
 (  
  SELECT Item = y.i.value('(./text())[1]', 'nvarchar(4000)')
  FROM 
  ( 
    SELECT x = CONVERT(XML, '<i>' 
      + REPLACE(@List, @Delimiter, '</i><i>') 
      + '</i>').query('.')
  ) AS a CROSS APPLY x.nodes('i') AS y(i)

);
GO

我正在寻找分割的方法

使用上面已有的表值函数,您可能可以编写如下查询:

INSERT INTO mytable (idname,ids)
SELECT substring(item, 1, charindex(':', item) - 1) AS idname
    ,right(item, Len(item) - charindex(':', item) - 1) AS ids
FROM (
    SELECT cf.*
    FROM test t
    CROSS APPLY dbo.SplitStrings_XML1(t.idname, '|') cf
    WHERE item IS NOT NULL
    ) t1;

SELECT *
FROM mytable;

你能发布你尝试过的东西吗?我已经编辑了我的帖子。请看一看。
UserID: 4
GroupID: 1
GroupParentID: 1
GroupType: 1
RevisedBy: 4
INSERT INTO mytable (idname,ids)
SELECT substring(item, 1, charindex(':', item) - 1) AS idname
    ,right(item, Len(item) - charindex(':', item) - 1) AS ids
FROM (
    SELECT cf.*
    FROM test t
    CROSS APPLY dbo.SplitStrings_XML1(t.idname, '|') cf
    WHERE item IS NOT NULL
    ) t1;

SELECT *
FROM mytable;