【问题标题】:Break string into rows tab delimited SQL Server将字符串分成行制表符分隔的 SQL Server
【发布时间】:2015-09-14 15:49:30
【问题描述】:

我正在尝试编写一个函数,它将字符串从插入到 SQL Server 表中的 .txt 文件(制表符分隔)批量拆分。

我已经成功地对批量插入的逗号分隔结果运行了该过程(使用函数),但似乎无法让它成功地将字符串拆分为制表符分隔的行。结果将字符串作为单行返回!

如果有人能帮忙就好了。

这是函数的代码

ALTER FUNCTION dbo.BreakStringIntoRows (@CommadelimitedString varchar(1000))
RETURNS @Result TABLE (Headers VARCHAR(500))
AS
BEGIN
    DECLARE @IntLocation INT

    WHILE (CHARINDEX('\t', @CommadelimitedString, 0) > 0)
    BEGIN
          SET @IntLocation = CHARINDEX('\t', @CommadelimitedString, 0)      

          INSERT INTO @Result (Headers)
             --LTRIM and RTRIM to ensure blank spaces are removed
             SELECT RTRIM(LTRIM(SUBSTRING(@CommadelimitedString, 0, @IntLocation)))   

          SET @CommadelimitedString = STUFF(@CommadelimitedString, 1, @IntLocation, '') 
    END

    INSERT INTO @Result (Headers)
       SELECT RTRIM(LTRIM(@CommadelimitedString))  -- LTRIM and RTRIM to ensure blank spaces are removed
    RETURN 
END
GO

【问题讨论】:

  • 问题出在分离器上。你需要一个新的,因为这个效率太低了。这是一篇出色的文章,其中包含许多效率更高的拆分器。 sqlperformance.com/2012/07/t-sql-queries/split-strings 有了新的拆分器后,您需要传递 ASCII 字符而不是 \t
  • SQL Server 中的 \t 不会转义到 tab,您需要实际使用选项卡,或者可能更清楚地使用 CHAR(9),因此您最终可能会得到 SET @IntLocation = CHARINDEX(CHAR(9), @CommadelimitedString, 0)
  • 对于 SQL Server 2014+,请查看 BULK INSERT command。对于其他版本,请查看bcp.exe utility 或 SQL Server Integration Services。在任何情况下,不要使用您自己的 CSV 解析器
  • @GarethD 应该在下面发布答案作为答案,以便 NClelland 可以接受答案并关闭此答案。
  • @GarethD 现在正在使用您的解决方案。谢谢。

标签: sql sql-server string


【解决方案1】:

\t 在 SQL Server 中不会转义到制表符,您需要实际使用制表符,或者可能更清楚地使用 CHAR(9),因此您最终可能会使用 SET @IntLocation = CHARINDEX(CHAR(9), @CommadelimitedString , 0) – 加雷斯D

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-22
    • 1970-01-01
    • 1970-01-01
    • 2022-01-07
    • 1970-01-01
    • 2017-04-25
    相关资源
    最近更新 更多