【问题标题】:Split comma delimited string and insert to a table (int)拆分逗号分隔的字符串并插入到表中(int)
【发布时间】:2014-05-03 00:12:11
【问题描述】:

我有一个包含 3 列 (First_ID,Second_ID,Third_ID) 的表,所有列都是 int 列。

现在我有3个值,第一个和第三个值是int值(1和0),第二个值是逗号分隔的字符串('188,189,190,191,192,193,194'

我应该用什么方法来填充表格,如下所示:

1   188 0
1   189 0
1   190 0
1   191 0
1   192 0
1   193 0
1   194 0

我尝试了不同的方法,但无法按我的意愿工作。

提前致谢

【问题讨论】:

标签: sql-server


【解决方案1】:

为此最好使用 XML,

Declare @Var nvarchar(MAX)

Set @Var ='188,189,190,191,192,193,194'

DECLARE @XML AS XML

DECLARE @Delimiter AS CHAR(1) =','

SET @XML = CAST(('<X>'+REPLACE(@Var,@Delimiter ,'</X><X>')+'</X>') AS XML)

DECLARE @temp TABLE (ID INT)

INSERT INTO @temp

SELECT N.value('.', 'INT') AS ID FROM @XML.nodes('X') AS T(N)

SELECT * FROM @temp

【讨论】:

  • XLM 不是比 VARCHAR 慢吗?
  • 抱歉耽搁了。由于 xml 验证,XML 类型的存储速度可能会慢一些。
  • 完美运行,无需创建数据库函数,非常适合一次性任务
【解决方案2】:

使用你在cmets中提到的Split()函数,

-- Variable holding comma separated values
DECLARE @Var VARCHAR(4000);
SET @Var =  '188,189,190,191,192,193,194'

-- Test Target Table
DECLARE @Target_Table TABLE  (First_ID INT,Second_ID INT,Third_ID INT) 

-- Insert statement
INSERT INTO @Target_Table
SELECT 1, CAST(Items AS INT) , 0 
FROM  dbo.Split(@Var, ',')  

-- Test Select
SELECT * FROM  @Target_Table  

结果集

╔══════════╦═══════════╦══════════╗
║ First_ID ║ Second_ID ║ Third_ID ║
╠══════════╬═══════════╬══════════╣
║        1 ║       188 ║        0 ║
║        1 ║       189 ║        0 ║
║        1 ║       190 ║        0 ║
║        1 ║       191 ║        0 ║
║        1 ║       192 ║        0 ║
║        1 ║       193 ║        0 ║
║        1 ║       194 ║        0 ║
╚══════════╩═══════════╩══════════╝  

【讨论】:

  • Split 不是 SQL Server 中的函数。使用 SQL Server 2012。我需要做任何特殊的事情吗
  • 没有SQL Server函数split()
  • 致那些(正确地)评论 SQL Server 不包含 Split() 函数的人;这个答案建议OP创建一个 dbo.split 函数,如链接到的问题所示。这个答案向 OP 展示了如何使用在另一个问题中创建的 split 函数来处理他们稍微复杂的情况。
  • 对于 SQL Server 2012 或更高版本,可以使用“dbo.SplitString()”。工作原理类似于 split() 函数。 :)
【解决方案3】:

从 SQL Server 2016 起,您可以使用此功能string_split

DECLARE @Var VARCHAR(4000);
SET @Var =  '188,189,190,191,192,193,194'

SELECT 1 as First_ID, value as Second_ID ,0 as Third_ID FROM string_split(@Var,',')

【讨论】:

  • 我正在使用 SQL Server 2017 但string_split 无法正常工作。
【解决方案4】:
DECLARE @Table VARCHAR(100)='AAA,BBB,CCC,DDD'
IF OBJECT_ID('[Comma_Split]') IS NOT NULL
DROP TABLE [Comma_Split]
CREATE TABLE [Comma_Split](ID INT IDENTITY(1,1),COL VARCHAR(100))
while LEN(@Table)>0
BEGIN
DECLARE @COMMA INT= CHARINDEX(',', @Table)
IF @COMMA=0 SET @COMMA=LEN(@Table)+1
INSERT INTO [Comma_Split]
SELECT SUBSTRING(@Table,1,@COMMA-1)
SET @COMMA=@COMMA+1
SET @Table=SUBSTRING(@Table,@COMMA,LEN(@Table))
END

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-21
    • 2015-03-07
    • 1970-01-01
    • 2016-12-18
    • 1970-01-01
    • 1970-01-01
    • 2017-01-05
    • 2012-05-24
    相关资源
    最近更新 更多