【问题标题】:Insert Comma seperated varchar into multiple column value? [duplicate]将逗号分隔的 varchar 插入多列值? [复制]
【发布时间】:2013-12-26 12:42:24
【问题描述】:

我有这样的 varchar 字符串值

"AccountType","contains","Customer","Balance","equals",250,"FirstName","like","John"

现在我想插入这个

在这样的表中

  FieldName       FieldContiion  FieldValue

  AccountType     contains       Customer
  Balance         equals         250
  FirstName       like           John

字符串变量的长度可以这样改变

"Balance","equals",250,"FirstName","like","John"
这意味着它只会在表格中插入两行。

【问题讨论】:

  • 对不起@ling.s 在我的情况下,一个表中有三个字段,我不能取一个常数值。
  • 创建一个存储过程以使用以下内容来分解字符串并插入到您的表中。 stackoverflow.com/questions/702968/…

标签: sql sql-server sql-server-2008


【解决方案1】:

您可以执行以下步骤:

1) 为您的逗号分隔字符串创建一个拆分函数:

CREATE FUNCTION [dbo].[Split] (
    @InputString                  VARCHAR(8000),
    @Delimiter                    VARCHAR(50)
)

RETURNS @Items TABLE (
    Item                          VARCHAR(8000)
)

AS
BEGIN
    IF @Delimiter = ' '
    BEGIN
          SET @Delimiter = ','
          SET @InputString = REPLACE(@InputString, ' ', @Delimiter)
    END

    IF (@Delimiter IS NULL OR @Delimiter = '')
        SET @Delimiter = ','

    DECLARE @Item                 VARCHAR(8000)
    DECLARE @ItemList       VARCHAR(8000)
    DECLARE @DelimIndex     INT

    SET @ItemList = @InputString
    SET @DelimIndex = CHARINDEX(@Delimiter, @ItemList, 0)
    WHILE (@DelimIndex != 0)
    BEGIN
          SET @Item = SUBSTRING(@ItemList, 0, @DelimIndex)
          INSERT INTO @Items VALUES (@Item)

          SET @ItemList = SUBSTRING(@ItemList, @DelimIndex+1, LEN(@ItemList)-@DelimIndex)
          SET @DelimIndex = CHARINDEX(@Delimiter, @ItemList, 0)
    END

    IF @Item IS NOT NULL
    BEGIN
          SET @Item = @ItemList
          INSERT INTO @Items VALUES (@Item)
    END

    ELSE INSERT INTO @Items VALUES (@InputString)

    RETURN

END

2) 创建一个接收逗号分隔字符串作为参数的过程。在此示例中,我使用的是您的固定字符串,但您应该修改它以使其与参数一起使用。 注意:我考虑到您的目标表总是有 3 列,并且逗号分隔的字符串的长度总是 3 的倍数......如果发生这种变化,您必须调整过程......

/* Get the length of the comma separated string */
DECLARE @ITEM_COUNT INT

SELECT @ITEM_COUNT = COUNT(*) FROM
(
    SELECT  item
        FROM Split('"AccountType","contains","Customer","Balance","equals",250,"FirstName","like","John"',',')  
) N

declare @x int
set @x = 1

/* Insert in your table every 3 columns... */
WHILE (@x < @ITEM_COUNT)
BEGIN 

    insert into test 
    select /* pivoting the sub-query */
      fieldname = max(case when seq = @x then item end),
      fieldcondition = max(case when seq = @x + 1 then item end),
      fieldvalue = max(case when seq = @x + 2 then item end)
    from 
    (
        SELECT  item
               ,row_number() OVER (ORDER BY (SELECT 1)) AS seq 
                FROM Split('"AccountType","contains","Customer","Balance","equals",250,"FirstName","like","John"',',')  
    ) a

set @x = @x + 3

END

希望对你有帮助

【讨论】:

  • 但是这里有一个问题。输出不是按顺序出现的。例如,当我输入“AccountName”、“contains”、“ort”、“AccountType”、“contains”、“Customer”时,结果不是按顺序“AccountName”“AccountType”“contains”“contains”“Customer”“奥特”
  • 是的,我在订购内部查询的结果集时犯了一个错误。解决方案就是使用“SELECT 1”忽略 ORDER BY 子句。我已经更新了
【解决方案2】:

在分隔符上拆分字符串(在您的情况下为,),然后遍历子字符串数组并插入表中。您的代码将类似于以下内容:

array subStrings[] = string.split(",");
int i=0;
while(i<len(subStrings)){
    // create query using the ith, (i+1)th and (i+2)th elements of the array
i=i+3;
}

上述代码中的一个假设是主字符串中的元素只能是 3 的倍数。

【讨论】:

    猜你喜欢
    • 2021-05-29
    • 2011-09-15
    • 1970-01-01
    • 1970-01-01
    • 2013-01-14
    • 1970-01-01
    • 2014-03-19
    • 1970-01-01
    • 2016-01-02
    相关资源
    最近更新 更多