2014-12-20 3 views
1

테이블에 있습니다 PersonDetail 여기에 NAME과 AGE가 포함되어 있습니다. I은 ​​'액톤 58 | 이리 20 | 라 14 | 데니, 52'등 콤마 파이프 분리 값 문자열과 같은 모든 데이터를 복용 한 애플리케이션 사용하고String에서 테이블에 데이터를 삽입하는 방법은 무엇입니까?

(주어진 포맷은 동일하다) 그 데이터를 테이블 (PersonDetail)에 삽입하고 싶지만 이름과 나이를 어떻게 구분할 수 있을지 모르겠습니다.

일부 사용자는 데이터를 분리 할 수있는 함수를 만들 것을 제안했지만 그럴 생각이 없습니다. 아무도 나에게 제안을 줄 수 있습니까 ?? 미리 감사드립니다 :)

+0

에 대해 서로 다른 문자열 함수를 적용해야합니다. 또는'bulk import'를 사용하여 파일에서 직접 읽어보십시오. –

답변

1

당신은 데이터를 분리하는 다중 문 테이블 값 기능을 만들 수 있습니다. 당신은 각각의 NAME과 AGE를 테이블 타입 변수에 삽입하기 만하면됩니다. 그리고 삽입 후에는 아래와 같이 테이블을 반환해야합니다. 문자열에서 데이터를 삽입하는 동안

CREATE FUNCTION UDF_InsertDataFromString 
(
@dataString VARCHAR(5000) 
) 
RETURNS @insertedData TABLE 
(
NAME VARCHAR(30), 
AGE INT 
) 
AS 
BEGIN 
    DECLARE @pipeIndex INT, 
      @commaIndex INT, 
      @LENGTH INT, 
      @NAME VARCHAR(100), 
      @AGE INT 
    SELECT @LENGTH = LEN(RTRIM(LTRIM(@dataString))), 
      @dataString = RTRIM(LTRIM(@dataString)) 

    WHILE (@LENGTH <> 0) 
    BEGIN 
     SELECT @LENGTH = LEN(@dataString), 
       @commaIndex = CHARINDEX(',', @dataString), 
       @pipeIndex = CHARINDEX('|', @dataString) 
     IF(@pipeIndex = 0) SET @pipeIndex = @LENGTH +1 
     SELECT @NAME = RTRIM(LTRIM(SUBSTRING(@dataString, 1, @commaIndex-1))), 
       @AGE = RTRIM(LTRIM(SUBSTRING(@dataString, @commaIndex+1, @[email protected]))), 
       @dataString = RTRIM(LTRIM(SUBSTRING(@dataString, @pipeIndex+1, @[email protected]))) 
      INSERT INTO @insertedData(NAME, AGE)  
      VALUES(@NAME, @AGE) 
     SELECT @LENGTH = LEN(@dataString)  
    END 
    RETURN 
END 

지금이 기능을 사용할 수 있습니다, 당신은 아래에 주어진 함수의 매개 변수로 문자열을 전달해야합니다.

DECLARE @personDetail TABLE(NAME VARCHAR(30), AGE INT) 

INSERT INTO @personDetail(NAME, AGE) 
SELECT NAME, AGE 
FROM dbo.UDF_InsertDataFromString('Acton,58|Nairi,20|Sara,14|Denny,52') 

SELECT NAME, AGE 
FROM @personDetail 
+0

이 솔루션에 대한 감사 인사입니다. 나는 이것을 시도 할 것이다 :) –

+0

환영 : –

1

사용 후

CREATE FUNCTION [dbo].[fnSplitString] 
( 
    @string NVARCHAR(MAX), 
    @delimiter CHAR(1) 
) 
RETURNS @output TABLE(splitdata NVARCHAR(MAX) 
) 
BEGIN 
    DECLARE @start INT, @end INT 
    SELECT @start = 1, @end = CHARINDEX(@delimiter, @string) 
    WHILE @start < LEN(@string) + 1 BEGIN 
     IF @end = 0 
      SET @end = LEN(@string) + 1 

     INSERT INTO @output (splitdata) 
     VALUES(SUBSTRING(@string, @start, @end - @start)) 
     SET @start = @end + 1 
     SET @end = CHARINDEX(@delimiter, @string, @start) 

    END 
    RETURN 
END 

및 FUNC이 분할

DECLARE @x table (id int identity(1,1) 
    ,     str varchar(50)) 
    DECLARE @str varchar(50)='Acton,58|Nairi,20|Sara,14|Denny,52' 
    INSERT INTO @x 
    SELECT * 
    FROM [dbo].[fnSplitString] (@str ,'|') 
    SELECT * 
    from @x 
    DECLARE @y int=(SELECT count(*) 
    FROM @x) 
    DECLARE @e varchar(50) 
    DECLARE @b varchar(50) 
    DECLARE @c varchar(50) 
    WHILE @y!=0 
    BEGIN 
     set @e =(SELECT str 
     FROM @x 
     where [email protected]) 
     set @b =(substring(@e,1,(charindex(',',@e)-1))) 
     set @c = (substring(@e,(charindex(',',@e)+1),len(@e)-charindex(',',@e))) 


     INSERT INTO PersonDetail 
     SELECT distinct @b 
     ,    @c 
     FROM @x 
     SET @[email protected] 
    END 
관련 문제