【问题标题】:How to work with CSV values in stored procedure?如何在存储过程中使用 CSV 值?
【发布时间】:2012-10-15 16:37:52
【问题描述】:

我将 CSV 值存储在字符串中:

    StringBuilder CSValue = new StringBuilder();
    for (int i = 0; i < obj._contactNumbers.Count; i++)
    {
        CSValue.Append(obj._contactNumbers[i]);
        if (i != obj._contactNumbers.Count - 1)
        {
            CSValue.Append(",");
        }
    }

我已将它传递给存储过程(如 CSValue.ToString()),现在我必须选择每个值并将其存储在单元格中。我应该如何分离这些值?

请帮帮我!

【问题讨论】:

  • 您使用的是哪个 DBMS? PostgreSQL?甲骨文? DB2?

标签: sql sql-server-2008 stored-procedures csv


【解决方案1】:

由于您使用的是 SQL Server 2008,而不是 CSV,因此我实际上会将它们推送到 XML 文档中,如下所示:

<Values>
    <Value value="1" />
    <Value value="2" />
    <Value value="3" />
</Values>

然后,在存储过程中,我将使用以下 SQL 将每个值作为单独的行检索:

SELECT value.value('(@value)[1]', 'INT') as 'id' 
FROM @idList.nodes('/Values/Value') as T(value)

此结果可以使用普通 SQL 查询连接与任何其他表连接,并获得所需的行为。

【讨论】:

    【解决方案2】:

    我定义了一个拆分函数。

    关于这方面有几个完整的 Stack Overflow 线程,例如Split function equivalent in T-SQL?

    【讨论】:

      【解决方案3】:

      你可以试试这个

      declare @Temp nvarchar(max), @c int, @a nvarchar(max)
      
      declare @Temp_Table table (value nvarchar(max))
      
      select @Temp = 'a,b,c,g,a'
      
      select @c = CHARINDEX(',', @Temp)
      while @c > 0
      begin
          insert into @Temp_Table
          select LEFT(@Temp, @c - 1)
      
          select @Temp = right(@Temp, LEN(@Temp) - @c)
          select @c = CHARINDEX(',', @Temp)
      end
      
      select * from @Temp_Table
      

      如果您需要经常这样做,您也可以编写一个表函数来执行此操作

      【讨论】:

      • 谢谢,它可以工作,但如果我想在表@Temp_Table 中添加 SNO 作为属性,以便我获得表中存在的最大行数,我应该如何在其中连续添加值? ??
      猜你喜欢
      • 2011-07-24
      • 2011-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多