2013-11-27 2 views
0

파일을 메모리로 읽어와 문자열을 저장 프로 시저에 전달해야합니다.SQL Server 임시 테이블 분할 문자열

임시 데이터베이스에서 해당 문자열의 각 줄을 새 행으로 분할하여 처리해야합니다.

약 500 자의 큰 문자열 (1000 줄)을 임시 데이터베이스로 변환하는 기능을 가진 사람이 있습니까?

감사

+0

문자열의 모양은 어떻습니까? – DevelopmentIsMyPassion

+0

문자열이 적은 파일로 약간 어렵습니다. 어쨌든 텍스트에서 작은 따옴표를 벗어나 확인을 위해 필요한 조치를 취했습니다. 나는 아래 함수와 비슷한 것을 사용했다. – user1619480

답변

3

분할 기능 (약 450 만 자까지 문자열을 처리 할이 하나의 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 '를 사용할 수 있습니다. 최대 약 7 천 1 백만자를 지원합니다. 그래도 충분하지 않다면 SQL Server에서 이러한 문자열을 분리하려고 시도하지 마십시오. 4,000,000조차도 외부에서 처리해야합니다 (C#은 SQL Server보다 훨씬 효율적입니다). –