2015-08-31 2 views
-3

я работаю над существующей таблицы аудита в SQL serevr 2010. У меня есть следующие строки в каждой строке:SQL-запрос, чтобы разделить одно значение строки в несколько колонок

"UserID: 4| GroupID: 1| GroupParentID: 1| GroupType: 1| RevisedBy: 4|" 

из строки. Моего плана, чтобы создать таблицу в следующем формате:

IDName  IDs 
--------  ---------- 
UserID   4 
GroupID   1 
GroupParentID 1 
GroupType  1 
RevisedBy  4 

Наконец я создаю что-то вроде этого: (ссылающееся идентификаторы с их основной таблицей)

IDName  IDs 
--------  ---------- 
UserID   User1 
GroupID   Gp1 
GroupParentID GG 
GroupType  type1 
RevisedBy  User1 

Надеется, что это имеет смысл. , пожалуйста, дайте мне знать, как достичь этого с высокой производительностью, так как таблица имеет миллионы строк.

благодаря

я использовал функцию разделения для разделения труб «|».

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 

Но я получаю таблицу с одним столбцом,

UserID: 4 
GroupID: 1 
GroupParentID: 1 
GroupType: 1 
RevisedBy: 4 

я ищу способы, чтобы расколоть это.

+0

Можете ли вы пост, что вы пробовали? – FutbolFan

+0

Я отредактировал мое сообщение. Пожалуйста, смотрите. – RNat

ответ

0

Использование существующей таблицы-значной функции выше, вы могли бы, вероятно, написать что-то вроде этого запроса:

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; 

SQL Fiddle Demo

+1

Спасибо большое .. работает .. – RNat