【发布时间】: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 INSERTcommand。对于其他版本,请查看bcp.exe utility 或 SQL Server Integration Services。在任何情况下,不要使用您自己的 CSV 解析器。 -
@GarethD 应该在下面发布答案作为答案,以便 NClelland 可以接受答案并关闭此答案。
-
@GarethD 现在正在使用您的解决方案。谢谢。
标签: sql sql-server string