2013-11-27 80 views
0

我有一个要求将文件读入内存并将字符串传递到存储过程。SQL Server临时表拆分字符串

我需要将该字符串的每个新行分割成临时数据库中的新行进行处理。

有没有人有一个功能,将一个大字符串(1000行)每行约500个字符转换成临时数据库。

感谢

+0

字符串是怎样的? – DevelopmentIsMyPassion

+0

字符串是一个较少的文件,这是有点困难。无论如何,我需要逃避文本中的单引号,以确保它正常运行。我使用了类似于以下功能的东西。 – user1619480

回答

3

创建分割功能(此人会处理字符串高达约4.5万字,这取决于SQL Server的版本):

CREATE FUNCTION [dbo].[SplitStrings_Ordered] 
(
    @List  NVARCHAR(MAX), 
    @Delimiter NVARCHAR(255) 
) 
RETURNS TABLE 
AS 
    RETURN (SELECT [Index] = ROW_NUMBER() OVER (ORDER BY Number), Item 
    FROM (SELECT Number, Item = SUBSTRING(@List, Number, 
     CHARINDEX(@Delimiter, @List + @Delimiter, Number) - Number) 
    FROM (SELECT ROW_NUMBER() OVER (ORDER BY s1.[object_id]) 
     FROM sys.all_objects AS s1 CROSS JOIN sys.all_objects AS s2) AS n(Number) 
     WHERE Number <= CONVERT(INT, LEN(@List)) 
     AND SUBSTRING(@Delimiter + @List, Number, LEN(@Delimiter)) = @Delimiter 
    ) AS y); 

,那么你把这个字符串中和说:

SELECT LineNumber = [Index], Line = Item 
INTO #temp 
FROM dbo.SplitStrings_Ordered(@StringParameter, CHAR(13)+CHAR(10)) AS x; 

你可能有CHAR(10)CHAR(13)玩 - 如何CR/LF存储在文件可能取决于在他们来自哪里。

+0

我几乎空的数据库在'sys.all_objects'中有大约2000条记录。在所有情况下都足够了吗? – Szymon

+1

如果您的文本文件有<= 4,000,000个字符(2,000^2),是。如果你的字符串有可能超过4,000,000个字符,那么你可以使用'sys.all_columns'来代替(在一个地方或两个地方)。这将支持大约71,000,000个字符。如果还不够,请停止尝试在SQL Server中拆分这些字符串。即使是4,000,000应该从外部处理(C#将比SQL Server更有效率)。 –