【问题标题】:How to insert string value into SQL Server table by separating by comma如何通过逗号分隔将字符串值插入 SQL Server 表
【发布时间】:2018-05-05 10:02:49
【问题描述】:
int QcEditorId = 21
string Freelancer = '2,3,4,5'

我想将此值插入到 SQL Server 表中,例如

QcEditorId  Freelancer
----------------------
  21           2
  21           3
  21           4
  21           5

请帮助我查询或存储过程

【问题讨论】:

  • 这些值从何而来?您希望一次插入多少个值?您正在使用的 sql server 版本是什么?
  • this
  • 现在有比公认的解决方案@Sandeep(用作WHILE 循环)更好的答案。但是,我敢肯定,如果 OP 花时间使用搜索引擎(例如,GoogleBingYahoo),他们会发现大量的数据集方法;甚至找到 SQL Server 的内置函数(如果他们使用 SQL Server 2016+,这将与他们相关)。分隔分隔符可能是关于 SQL 的 SO 上最常见的问题之一,因此 OP 应该首先自己做出一些努力。 :)
  • @Larnu 我有点同意。但是,当没有提到 SQL Server 版本时,我们总是可以使用普通的旧方法。
  • @Sandeep 在 SQL Server 2016 之前仍有可用的数据集方法;其中几乎所有这些都适用于 SQL Server 2008+。 WHILE 循环是这里最糟糕的解决方案。

标签: sql sql-server


【解决方案1】:
String_split starting in SQL server 2016 have ability to split your strings 

例子:

 declare @table table (QcEditorId int, Freelancer varchar (100))

    insert into @table
    select 21, '2,3,4,5'
    declare @freelancer varchar(100)
    = (select freelancer from @table)

    select QcEditorId,x.value Name  from @table
    cross apply(
    select *  from string_split(@freelancer,',') ) x
       -- Use this function to split strings and , as delimiter

--或者对于以前的版本,创建一个表值函数,很多 ----可在网络上找到

 Example:

    CREATE FUNCTION [dbo].[splitstring] ( @stringToSplit VARCHAR(MAX) )
    RETURNS
     @returnList TABLE ([Name] [nvarchar] (500))
    AS
    BEGIN

     DECLARE @name NVARCHAR(255)
     DECLARE @pos INT

     WHILE CHARINDEX(',', @stringToSplit) > 0
     BEGIN
      SELECT @pos  = CHARINDEX(',', @stringToSplit)  
      SELECT @name = SUBSTRING(@stringToSplit, 1, @pos-1)

      INSERT INTO @returnList 
      SELECT @name

      SELECT @stringToSplit = SUBSTRING(@stringToSplit, @pos+1, LEN(@stringToSplit)-@pos)
     END

     INSERT INTO @returnList
     SELECT @stringToSplit

     RETURN
    END

解决方案:

declare @table table (QcEditorId int, Freelancer varchar (100))

insert into @table
select 21, '2,3,4,5'
declare @freelancer varchar(100)
= (select freelancer from @table)

select QcEditorId,x.Name  from @table
cross apply(
select *  from [dbo].[SplitString](@freelancer) ) x

【讨论】:

  • 我个人建议使用数据集方法和内联表函数。就像我在 cmets 中所说的,这里没有理由使用 WHILE 循环,这本来就很慢,而且多语句函数也比内联函数慢得多。
  • @Larnu 同意,OP 没有做出任何努力。
【解决方案2】:
DECLARE @FLXML AS XML 
SET @FLXML = cast(('<a>'+replace(@FreelancerId,',' ,'</a><a>')
            +'</a>') AS XML)
INSERT INTO [QMT_UserMaping](QcEditor_ID,Freelancer_ID)
SELECT @QCId,A.VALUE('.', 'varchar(max)')
    FROM @FLXML.nodes('a') AS FN(a)

【讨论】:

  • 如果您想将数据插入表而不是使用 XML,您可以查看我给出的答案。谢谢。
【解决方案3】:

SQL 用户定义的拆分函数

ALTER FUNCTION [dbo].[fnSplitString] 
( 
    @string NVARCHAR(MAX), 
    @delimiter CHAR(1) 
) 
RETURNS @output TABLE(splitdata NVARCHAR(MAX)) 
BEGIN 
    DECLARE @start INT, @end INT 
    SELECT @start = 1, @end = CHARINDEX(@delimiter, @string) 
    WHILE @start < LEN(@string) + 1 BEGIN 
        IF @end = 0  
            SET @end = LEN(@string) + 1

        INSERT INTO @output (splitdata)  
        VALUES(SUBSTRING(@string, @start, @end - @start)) 
        SET @start = @end + 1 
        SET @end = CHARINDEX(@delimiter, @string, @start)

    END 
    RETURN 
END

INSERT 命令

INSERT INTO YourTable(QcEditorId,Freelancer) 
SELECT 21,splitdata FROM [dbo].[fnSplitString]('2,3,4,5' ,',' )

STRING_SPLIT (MSSQL Server 2016)

无需自定义用户定义函数

INSERT INTO YourTable(QcEditorId,Freelancer) 
SELECT 21,value FROM STRING_SPLIT('2,3,4,5' ,',' ) 

【讨论】:

    【解决方案4】:
    I have a SQL Table like this:
    | SomeID         | OtherID     | Data
    +----------------+-------------+-------------------
    | abcdef-.....   | cdef123-... | 18,20,22
    | abcdef-.....   | 4554a24-... | 17,19
    | 987654-.....   | 12324a2-... | 13,19,20
    Is there a query where I can perform a query like SELECT OtherID, SplitData WHERE SomeID = 'abcdef-.......' that returns individual rows, like this?
    | OtherID     | SplitData
    +-------------+-------------------
    | cdef123-... | 18
    | cdef123-... | 20
    | cdef123-... | 22
    | 4554a24-... | 17
    | 4554a24-... | 19
    Basically split my data at the comma into individual rows?
    create table Testdata(SomeID int, OtherID int, Data varchar(max))
    insert Testdata select 1, 9, '18,20,22'
    insert Testdata select 2, 8, '17,19'
    insert Testdata select 3, 7, '13,19,20'
    insert Testdata select 4, 6, ''
    --The query
    ;with tmp(SomeID, OtherID, DataItem, Data) as (
    select SomeID, OtherID, LEFT(Data, CHARINDEX(',',Data+',')-1),
        STUFF(Data, 1, CHARINDEX(',',Data+','), '')
    from Testdata
    union all
    select SomeID, OtherID, LEFT(Data, CHARINDEX(',',Data+',')-1),
        STUFF(Data, 1, CHARINDEX(',',Data+','), '')
    from tmp
    where Data > ''
    )
    select SomeID, OtherID, DataItem
    from tmp
    order by SomeID
    -- OPTION (maxrecursion 0)
    -- normally recursion is limited to 100. If you know you have very long
    -- strings, uncomment the option
    Output
    SomeID  OtherID  DataItem
    1       9        18
    1       9        20
    1       9        22
    2       8        17
    2       8        19
    3       7        13
    3       7        19
    3       7        20
    4       6   
    9       11       1
    9       11       2
    9       11       3
    9       11       4
    etc.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多