Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.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_Join_Common Table Expression_Sql Function_Table Variable - Fatal编程技术网

Sql server 读取逗号分隔的值并批量插入SQL表

Sql server 读取逗号分隔的值并批量插入SQL表,sql-server,join,common-table-expression,sql-function,table-variable,Sql Server,Join,Common Table Expression,Sql Function,Table Variable,我在sql表中有4列 id (PK auto increment), name , org , TourCode Varchar(MAX) TourCode包含逗号分隔的代码,例如(AVG123、JGH12等) 我有可用的逗号分隔值的代码 我必须编写一个查询,在Offer表中插入4000行,每行包含10个用逗号分隔的旅游代码。 对于所有4000行,名称和组织的值保持不变,例如“ABC”、“Amazon” e、 g 我最好的方法应该是什么 我正在使用SQL Server。 提前感谢。这是如何将逗

我在sql表中有4列

id (PK auto increment), name , org , TourCode Varchar(MAX)
TourCode包含逗号分隔的代码,例如(AVG123、JGH12等)

我有可用的逗号分隔值的代码

我必须编写一个查询,在Offer表中插入4000行,每行包含10个用逗号分隔的旅游代码。 对于所有4000行,名称和组织的值保持不变,例如“ABC”、“Amazon”

e、 g

我最好的方法应该是什么

我正在使用SQL Server。
提前感谢。

这是如何将逗号分隔的值拆分为一个表(取自)

之后

使用此代码

DECLARE @TourCodes  varchar(4000)
SET @TourCodes  = 'AAAAA,BBBBB,CCCCC,DDDD,EEEE,FFFF , GGG,HHHHH, IIIII,JJJJJ'

DECLARE @T as table (ID int identity, Name varchar(255), Org varchar(255), TourCode varchar(255))

INSERT @T (Name, Org, TourCode)
select 'ABC', 'AMAZON', Item from dbo.split(@TourCodes,',')


Select A.Name, A.Org, ISNULL(A.TourCode, '') + ',' + ISNULL(B.TourCode, '')
from @T A INNER JOIN @T B
ON A.ID = B.ID-1
AND A.ID%2 = 0

那么这个解决方案呢

DECLARE @TourCodes VARCHAR(4000);
SET @TourCodes =  ' AVG123   , JGH12,AVasfG123,JGsdfH12,AVsdgG123,JsdgGH12 , A34G123,J56gGH12, A34G1df23,JgfGH12';

with rcrs AS (
select rtrim(ltrim(LEFT(@TourCodes,charindex(',',@TourCodes)-1))) first,     
       SUBSTRING(@TourCodes+',',charindex(',',@TourCodes)+1,4000) other,
       0 flg
union all
select rtrim(ltrim(LEFT(other,charindex(',',other)-1))) first,
       SUBSTRING(other,charindex(',',other)+1,4000) other ,
       flg+1 flg FROM rcrs WHERE charindex(',',other)>0

) 
SELECT a.first one,b.first two from rcrs a 
INNER JOIN rcrs b ON b.flg=a.flg+1 WHERE a.flg%2=0
在递归CTE中,字符串从开头开始拆分

可能值得注意的是,在递归CTE的第一部分中,我在原始字符串后面加了一个额外的
,'
。这确保了所有单词都被CTE“吃掉”,然后可以由主选择使用模(
%
)技巧处理,以确定哪个部分进入列
one
two

此示例的结果是:

one       two

AVG123    JGH12
AVasfG123 JGsdfH12
AVsdgG123 JsdgGH12
A34G123   J56gGH12
A34G1df23 JgfGH12
请参见此处以获取演示:

编辑

我显然有太多的时间;-)
因此,我继续尝试是否可以按照OP希望的方式,将所有内容重新组合成一个十列的集合。我仍然不完全清楚结果是什么样子的,但下面是另一个镜头:

DECLARE @TourCodes VARCHAR(4000);
SET @TourCodes =  REPLACE(REPLACE(
                  ' AVG123   , JGH12,AVasfG123,JGsdfH12,AVsdgG123,JsdgGH12 , A34G123,J56gGH12, A34G1df23,JgfGH12,
                    AVG1234   , JGH126,AVasfG1238,JGsdfH122,AVsdgG1235,JsdgGH127 , A34G1239,J56gGH12a, A34G1df23c,JgfGH12e,
                    AVG1235   , JGH127,AVasfG1239,JGsdfH123,AVsdgG1236,JsdgGH128 , A34G1230,J56gGH12b, A34G1df23d,JgfGH12f',
                   char(10),''),char(13),''); -- this is just a slightly extended sample input string

with rcrs AS (
select rtrim(ltrim(LEFT(@TourCodes,charindex(',',@TourCodes)-1))) first,

       SUBSTRING(@TourCodes+',',charindex(',',@TourCodes)+1,4000) other, 0 flg
union all
select rtrim(ltrim(LEFT(other,charindex(',',other)-1))) first,
       SUBSTRING(other,charindex(',',other)+1,4000) other , flg+1 flg FROM rcrs WHERE charindex(',',other)>0 and flg<30

), cmbn AS (
  SELECT a.flg/20 ii,(a.flg/2)%10 ij ,a.first+','+b.first tc FROM rcrs a
  LEFT JOIN rcrs b ON b.flg=a.flg+1
  WHERE a.flg%2=0
)
SELECT ii,'ABC' name,'Amazon' org, MAX(CASE ij WHEN 0 THEN tc END) tc1,
  MAX(CASE ij WHEN 1 THEN tc END) tc2,
  MAX(CASE ij WHEN 2 THEN tc END) tc3,
  MAX(CASE ij WHEN 3 THEN tc END) tc4,
  MAX(CASE ij WHEN 4 THEN tc END) tc5,
  MAX(CASE ij WHEN 5 THEN tc END) tc6,
  MAX(CASE ij WHEN 6 THEN tc END) tc7,
  MAX(CASE ij WHEN 7 THEN tc END) tc8,
  MAX(CASE ij WHEN 8 THEN tc END) tc9,
  MAX(CASE ij WHEN 9 THEN tc END) tc10
FROM cmbn GROUP BY ii
请看这里:

或者,如果你想把所有的十个旅游代码都放在一列中,你可以这样做

SELECT ii,'ABC' name,'Amazon' org, 
           MAX(CASE ij WHEN 0 THEN tc END)+' '+
  COALESCE(MAX(CASE ij WHEN 1 THEN tc END)+' ','')+
  COALESCE(MAX(CASE ij WHEN 2 THEN tc END)+' ','')+
  COALESCE(MAX(CASE ij WHEN 3 THEN tc END)+' ','')+
  COALESCE(MAX(CASE ij WHEN 4 THEN tc END)+' ','')+
  COALESCE(MAX(CASE ij WHEN 5 THEN tc END)+' ','')+
  COALESCE(MAX(CASE ij WHEN 6 THEN tc END)+' ','')+
  COALESCE(MAX(CASE ij WHEN 7 THEN tc END)+' ','')+
  COALESCE(MAX(CASE ij WHEN 8 THEN tc END)+' ','')+
  COALESCE(MAX(CASE ij WHEN 9 THEN tc END)+' ','') tourCodes
FROM cmbn GROUP BY ii
在主菜单中选择。看这里

结果:

ii name org     tourCodes
0  ABC  Amazon  AVG123,JGH12 AVasfG123,JGsdfH12 AVsdgG123,JsdgGH12 A34G123,J56gGH12 A34G1df23,JgfGH12 AVG1234,JGH126 AVasfG1238,JGsdfH122 AVsdgG1235,JsdgGH127 A34G1239,J56gGH12a A34G1df23c,JgfGH12e 
1  ABC  Amazon  AVG1235,JGH127 AVasfG1239,JGsdfH123 AVsdgG1236,JsdgGH128 A34G1230,J56gGH12b A34G1df23d,JgfGH12f 

然后尝试此操作,然后使用分号尝试拆分SP

create FUNCTION GroupBySemicolon (
      @TourCodes                  VARCHAR(8000),
      @HowManyTours               int
)

RETURNS varchar(8000)
AS
BEGIN


DECLARE @i int
DECLARE @Pos int

SET @i = 0
SET @Pos = 1
WHILE @Pos <> 0
BEGIN
    SET @i= @i+1
    SET @Pos = CHARINDEX( ',', @TourCodes,@Pos + 1)
    --SELECT @Pos
    IF @i = @HowManyTours and @Pos > 0
    BEGIN
        SET @i = 0

        SET @TourCodes = LEFT(@TourCodes,@Pos-1) + ';' + RIGHT(@TourCodes, LEN(@TourCodes) - @Pos)
    END

END




RETURN @TourCodes

END
此函数将以分号分隔每N个行程

create FUNCTION GroupBySemicolon (
      @TourCodes                  VARCHAR(8000),
      @HowManyTours               int
)

RETURNS varchar(8000)
AS
BEGIN


DECLARE @i int
DECLARE @Pos int

SET @i = 0
SET @Pos = 1
WHILE @Pos <> 0
BEGIN
    SET @i= @i+1
    SET @Pos = CHARINDEX( ',', @TourCodes,@Pos + 1)
    --SELECT @Pos
    IF @i = @HowManyTours and @Pos > 0
    BEGIN
        SET @i = 0

        SET @TourCodes = LEFT(@TourCodes,@Pos-1) + ';' + RIGHT(@TourCodes, LEN(@TourCodes) - @Pos)
    END

END




RETURN @TourCodes

END

从SQL-SERVER 2016开始,这里有一个表值函数
string\u split()
。@cars10 string\u split()将根据逗号分割值,每行将有1个tourcode,总记录数将为400。我的要求是,我想要2个(示例)每行和总行的旅行代码将为200。这给出的结果不正确。我希望每个值有2个tourcodes,它会给出随机结果修改查询,立即尝试Hey@asmgx..感谢您的回复。但是此查询有一个问题。如果我希望每行10个Tourcode,该怎么办?我必须修改整个查询。在这种情况下,您最好循环使用逗号分隔的值,并在10个逗号后将逗号更改为分号,然后按分号拆分要求有所不同。我有40000个旅游代码作为逗号分隔的值,我必须编写一个查询,在报价表中插入4000行,每行包含10个旅游代码。每行10个旅游代码应该用逗号分隔。好吧,这不是免费的编码服务。如果您可以使用我的代码片段找到自己的解决方案,那么这将符合stackoverflow的最佳精神。否则:继续寻找/尝试。祝你好运下一组4应该位于下一行,而不是半列。如果有12个tourcode和HowManyTours是4,那么我们应该有3行,每行4个tourcode!!选择“ABC”、“Amazon”、“dbo.Split”(dbo.GroupBySemicolon('11122222333,4455555,6677888899999000000',4)、;'),如果这回答了您的问题,则将其标记为答案
ii name org     tourCodes
0  ABC  Amazon  AVG123,JGH12 AVasfG123,JGsdfH12 AVsdgG123,JsdgGH12 A34G123,J56gGH12 A34G1df23,JgfGH12 AVG1234,JGH126 AVasfG1238,JGsdfH122 AVsdgG1235,JsdgGH127 A34G1239,J56gGH12a A34G1df23c,JgfGH12e 
1  ABC  Amazon  AVG1235,JGH127 AVasfG1239,JGsdfH123 AVsdgG1236,JsdgGH128 A34G1230,J56gGH12b A34G1df23d,JgfGH12f 
create FUNCTION GroupBySemicolon (
      @TourCodes                  VARCHAR(8000),
      @HowManyTours               int
)

RETURNS varchar(8000)
AS
BEGIN


DECLARE @i int
DECLARE @Pos int

SET @i = 0
SET @Pos = 1
WHILE @Pos <> 0
BEGIN
    SET @i= @i+1
    SET @Pos = CHARINDEX( ',', @TourCodes,@Pos + 1)
    --SELECT @Pos
    IF @i = @HowManyTours and @Pos > 0
    BEGIN
        SET @i = 0

        SET @TourCodes = LEFT(@TourCodes,@Pos-1) + ';' + RIGHT(@TourCodes, LEN(@TourCodes) - @Pos)
    END

END




RETURN @TourCodes

END
select dbo.GroupBySemicolon( '111,222222,333,44,555555,66 ,7777,8888, 99999,000000', 4)