2017-10-05 4 views
0

고정 너비의 데이터가있는 텍스트 파일이 있습니다. 텍스트 파일에는 ID, 데이터, 상태가 포함됩니다. ID는 단순한 INT입니다. State에는 2 개의 CHAR statename이 있습니다. 데이터는 해당 주에 등록 된 회사의 정보입니다. SQL 서버 와이드 테이블에 고정 너비 파일

는 SQL 서버 테이블에 넣어하려면 내가 먼저라는 SQLServer에 테이블에 텍스트 파일을 덤프는

참고 dbo.rawcompanyinfo_delimited : 나는 데이터 열에 만 4 열을 표시 한 설명의 편의를 위해. 그것에는 500의 란이있다.

CREATE TABLE dbo.rawcompanyinfo_delimited(ID smallint NOT NULL, Data VARCHAR(MAX) NULL, State CHAR(2)); 

INSERT INTO dbo.rawcompanyinfo_delimited(100,'ABCINC 111 333.5 USD','PA') 
INSERT INTO dbo.rawcompanyinfo_delimited(200,'APPLE  213 333.5 USD','PA') 
INSERT INTO dbo.rawcompanyinfo_delimited(300,'BTEC  100 123.5 USD','PA') 
INSERT INTO dbo.rawcompanyinfo_delimited(400,'S INC  123 333.0 USD','PA') 
INSERT INTO dbo.rawcompanyinfo_delimited(500,'B INC  145 123.2 USD','PA') 

또한 dbo.rawcompanyinfo_delimited을 통해 그때 map.CompaniesLenInfo을 통해 루프 중첩 된 커서를 썼다

CREATE TABLE map.CompaniesLenInfo(Startingposition int not null, Length int not null, columnnames varchar(100) not null) 
insert into map.CompaniesLenInfo(1,10,CompanyName) 
insert into map.CompaniesLenInfo(11,3,CompanyID) 
insert into map.CompaniesLenInfo(15,5,TotalIncome) 
insert into map.CompaniesLenInfo(21,3,Currency) 

map.CompaniesLenInfo에 저장 나 Startingposition, 길이, COLUMNNAMES을 알려주는 매핑 테이블이 결과를 테이블에 저장하십시오. 나는 넓은 table.Can 사람으로 삽입 할 수 있습니다

CREATE TABLE dbo.output(ID INT , CompanyName VARCHAR(10),CompanyID VARCHAR(3),TotalIncome VARCHAR(5),Currency VARCHAR(3)) ; 
INSERT INTO dbo.output(100,'ABCINC','111','333.5','USD','PA') 
INSERT INTO dbo.output(200,'APPLE','213','333.5', 'USD','PA') 
INSERT INTO dbo.output(300,'BTEC'  ,'100', '123.5', 'USD','PA') 
INSERT INTO dbo.output(400,'S INC'  ,'123', '333.0', 'USD','PA') 
INSERT INTO dbo.output(500,'B INC'  ,'145', '123.2', 'USD','PA') 

DECLARE @ID INT,@StartPosition INT,@Len INT; 
DECLARE @Data NVARCHAR(MAX), @ColumnName VARCHAR(100),@Val VARCHAR(MAX),@CompanyID CHAR(9),@State_Code VARCHAR(2); 
DECLARE @Currency VARCHAR(10); 
DECLARE @FinCursor AS CURSOR; 

DECLARE @ParsingCursor AS CURSOR; 
SET @FinCursor=CURSOR FAST_FORWARD FOR SELECT ID,Data 
FROM map.CompaniesLenInfo WHERE State='PA'; 
OPEN @FinCursor; 
FETCH NEXT FROM @FinCursor INTO @ID,@Data; 
WHILE @@FETCH_STATUS = 0 
BEGIN 


    SET @ParsingCursor = CURSOR FAST_FORWARD FOR SELECT StartPosition,Length,columnnames 
    FROM dbo.rawcompanyinfo_delimited; 
    OPEN @ParsingCursor; 
    FETCH NEXT FROM @ParsingCursor INTO @StartPosition, @Len, @ColumnName; 
    WHILE @@FETCH_STATUS = 0 
     BEGIN 
      SET @Val = SUBSTRING(@Data,@StartPosition, @Len); 
      /* Not sure how to insert into dbo.output*/ 

      FETCH NEXT FROM @ParsingCursor INTO @StartPosition, @Len, @ColumnName; 
     END 

    CLOSE @ParsingCursor; 
    DEALLOCATE @ParsingCursor; 


FETCH NEXT FROM @FinCursor INTO @ID,@Data; 

END 
CLOSE @FinCursor; 
DEALLOCATE @FinCursor; 

방법은 아래처럼 빠를 수있는 다른 방법을 제안?

답변

1

은 샘플은 PIVOT을 사용하고 있습니다 :

CREATE TABLE dbo.rawcompanyinfo_delimited (ID smallint NOT NULL, 데이터 VARCHAR (MAX) NULL, 상태 CHAR (2));

INSERT INTO dbo.rawcompanyinfo_delimited(id,data,State)values(100,'ABCINC 111 333.5 USD','PA') 
INSERT INTO dbo.rawcompanyinfo_delimited(id,data,State)values(200,'APPLE  213 333.5 USD','PA') 
INSERT INTO dbo.rawcompanyinfo_delimited(id,data,State)values(300,'BTEC  100 123.5 USD','PA') 
INSERT INTO dbo.rawcompanyinfo_delimited(id,data,State)values(400,'S INC  123 333.0 USD','PA') 
INSERT INTO dbo.rawcompanyinfo_delimited(id,data,State)values(500,'B INC  145 123.2 USD','PA') 

CREATE TABLE CompaniesLenInfo(Startingposition int not null, Length int not null, columnnames varchar(100) not null) 
insert into CompaniesLenInfo(Startingposition,Length,columnnames)VALUES(1,10,'CompanyName') 
insert into CompaniesLenInfo(Startingposition,Length,columnnames)VALUES(11,3,'CompanyID') 
insert into CompaniesLenInfo(Startingposition,Length,columnnames)VALUES(15,5,'TotalIncome') 
insert into CompaniesLenInfo(Startingposition,Length,columnnames)VALUES(21,3,'Currency') 

SELECT * 
FROM (
    SELECT r.ID,r.State,SUBSTRING(r.Data,ci.Startingposition,ci.Length) AS val,ci.columnnames 
    FROM rawcompanyinfo_delimited AS r,CompaniesLenInfo AS ci 
) AS t PIVOT(MAX(val) FOR columnnames IN (CompanyName,CompanyID,TotalIncome,Currency)) p 
 
+-----+-------+-------------+-----------+-------------+----------+ 
| ID | State | CompanyName | CompanyID | TotalIncome | Currency | 
+-----+-------+-------------+-----------+-------------+----------+ 
| 100 | PA | ABCINC  | 111  | 333.  | US  | 
| 200 | PA | APPLE  | 213  | 333.  | US  | 
| 300 | PA | BTEC  | 100  | 123.  | US  | 
| 400 | PA | S INC  | 123  | 333.  | US  | 
| 500 | PA | B INC  | 145  | 123.  | US  | 
+-----+-------+-------------+-----------+-------------+----------+ 
1

명령 줄 도구 bcp, 대량 복사 프로그램을 사용하십시오. bcp가 데이터를 구문 분석하고로드합니다. 고정 폭 열의 시작 및 끝 지점을 정의하려면 "형식 파일"을 정의해야합니다. 다른 문자 (예 : ~)로 구분 된 데이터를 가져올 수있는 경우 열 구분 기호 및 행 종결자를 정의하는 것이 더 쉽습니다. 커서를 사용할 필요가 없습니다 https://docs.microsoft.com/en-us/sql/relational-databases/import-export/use-a-format-file-to-bulk-import-data-sql-server

0

:

다음은 문서 참조입니다. 출력 테이블에 원시 데이터 테이블에서 데이터를로드하려면, 당신은 SELECT 문 INSERT 하나 (당신이 500 열이있는 경우 어쩌면 조금 긴)를 사용할 수 있습니다 : 여기

INSERT INTO dbo.output(ID,CompanyName,CompanyID,TotalIncome,Currency) 
SELECT r.ID, 
     (SELECT Substring(r.Data, m.startingposition, m.length) 
     FROM map.CompaniesLenInfo AS m 
     WHERE m.columnnames = 'CompanyName'), 
     ... 
     (SELECT Substring(r.Data, m.startingposition, m.length) 
     FROM map.CompaniesLenInfo AS m 
     WHERE m.columnnames = 'Currency') 
    FROM dbo.rawcompanyinfo_delimited AS r