вставить в таблицу с разбивкой строки в SQL - PullRequest
0 голосов
/ 12 января 2019

Я хочу вставить свою разделенную строку в мою таблицу, как вы видите:

create table #Organization
(
    organizationId bigint, 
     provienceId bigint, 
     CityId bigint, 
      TownId bigint 

)
Insert Into #Organization  ( organizationId) 
 select  p.value from  string_split('1,2,3', ',') p
Insert Into #Organization  ( provienceId) 
 select  p.value from  string_split('1,2,3', ',') p
Insert Into #Organization  ( CityId) 
 select  p.value from  string_split('1,2,3', ',') p
Insert Into #Organization  ( TownId) 
 select  p.value from  string_split('1,2,3', ',') p

Мой ожидаемый результат примерно такой:

1   1     1   1
2   2     2   2
3   3     3   3

Но он возвращает это:

enter image description here

Ответы [ 3 ]

0 голосов
/ 12 января 2019

Возможно, я читаю ваш вопрос, но я подозреваю, что вы хотите разбить вашу строку на столбцы

* ** 1003 тысяча два * Пример
Declare @YourTable table (SomeColName varchar(max)) 
Insert Into @YourTable values 
 ('1,2,3')
,('A,B,C')
,('Dog,Cat,Pony')

Select B.*
 From  @YourTable A
 Cross Apply (
                Select Pos1 = ltrim(rtrim(xDim.value('/x[1]','varchar(max)')))
                      ,Pos2 = ltrim(rtrim(xDim.value('/x[2]','varchar(max)')))
                      ,Pos3 = ltrim(rtrim(xDim.value('/x[3]','varchar(max)')))
                From  (Select Cast('<x>' + replace((Select replace(SomeColName ,',','§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml) as xDim) as A 
             ) B

Returns

Pos1    Pos2    Pos3
1       2       3
A       B       C
Dog     Cat     Pony
0 голосов
/ 12 января 2019

Я бы использовал pivot для преобразования столбцов в строки. Как:

INSERT INTO #organization 
            (provinceid, 
             cityid, 
             townid) 
SELECT * 
FROM   (SELECT p.value, 
               RowN = Row_number() 
                        OVER ( 
                          ORDER BY (SELECT NULL)) 
        FROM   String_split('1,2,3', ',') p) a 
       PIVOT (Max(a.value) 
             FOR rown IN ([1], 
                          [2], 
                          [3])) b 
0 голосов
/ 12 января 2019

Вставка вставляет три строки, по одной для каждого значения. Если вы хотите объединить их в столбцы, вам нужно повернуть их или (как я предпочитаю) использовать агрегацию.

У вас также есть таблица с четырьмя столбцами, но, кажется, вставляются только три, поэтому я подозреваю, что вы хотите:

create table #Organization (
    organizationId int identity(1, 1) primary key, 
    provinceId int, 
    CityId int, 
    TownId int 
);

(я не вижу необходимости в bigint для этого примера.)

Очевидно, самое простое решение - не использовать строки:

Insert Into #Organization (provinceId, CityId, TownId) 
    values (1, 2, 3);

Но если вы используете строки, вы можете попробовать:

Insert Into #Organization (provinceId, CityId, TownId) 
    select provinceId, CityId, TownId
    from (values('1,2,3')) v(str) cross apply
         (select max(case when seqnum = 1 then p.value end) as provinceid,
                 max(case when seqnum = 2 then p.value end) as cityid,
                 max(case when seqnum = 3 then p.value end) as townid                 
          from (select p.*,
                       row_number() over (order by charindex(',' + p.value + ',', ',' + v.str + ',')) as seqnum
                from string_split(v.str, ',') p
               ) p
         ) s;

Обратите внимание, что существует проблема с использованием string_split() для этой цели, потому что он не "запоминает" положение подстроки в исходной строке. Это пытается обойти эту проблему с помощью charindex(). В вашем случае это будет работать, потому что все значения являются числами.

Здесь - это дБ <> скрипка.

...