在SQL中插入带有拆分字符串的表

在SQL中插入带有拆分字符串的表,sql,sql-server,split,Sql,Sql Server,Split,我想将拆分字符串插入到我的表中,如您所见: 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 In

我想将拆分字符串插入到我的表中,如您所见:

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
但它返回的是:


插入是插入三行,每个值一行。如果要将它们组合到列中,则需要对它们进行透视,或者(我更喜欢)使用聚合

您还有一个包含四列的表,但似乎只插入了三列,因此我怀疑您想要:

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\u split()
时存在一个问题,因为它无法“记住”子字符串在原始字符串中的位置。这试图通过使用
charindex()
来解决此问题。在您的情况下,这将起作用,因为这些值都是数字


是一个dbfiddle。

也许我在读你的问题,但我怀疑你想把字符串分成几列

示例

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

我将使用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 

您需要第二个和第三个的update语句statement@PrashantPimpale如何更新记录?是每次只有三个值还是这不是真实数据?@PrashantPimpale这不是真实数据,可以精确地更改,因此您能否提供实际处理的样本数据?期待您的回答!谢谢,但我想说的是,1,2,3是一个例子,它可以改成其他的values@EhsanAkbar . . . 这个答案中没有任何东西可以排除这一点。你看小提琴了吗?它有其他值的例子。如果我想把123456789改成14758369,我该怎么办?你在找矩阵运算吗?也许可以编辑您的问题并添加更清晰的数据样本和所需的结果。@EhsanAkbar很乐意为您提供帮助。。。我猜:)嗨,再次,事实上在我的问题中我期待这些结果,11,2 2 2,3 3 3,你能帮我怎么得到这个结果吗?我再次改变了我的问题嗨,事实上在我的问题中我期待这些结果,1 1 1,2 2 2 2,3 3 3 3 3,你能帮我怎么得到这个结果吗?
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