Pondlife에게 조언 해 주셔서 감사합니다. 제 질문에 대한 답을 얻었습니다. 여기 있습니다. 우리는 내가 같은 시간에 헤더와 세부
HR을 가지고이 텍스트 파일을 알고뿐만 아니라
| 001580/06 | RG | 2013년 11월 1일 12 : 00 | BG | 3573 | 001580 | IT | 001580/01 | 1 | 00147066 || 1200 | 852.3 | 830.3 | 1.35 | UNIT | 0 | 31/12/2014 0시 IT | 001580/02 | 1 | 00147066 || 200 | 852.3 | 830.3 | 1.35 | UNIT | 1 | 31/12/2014 0시 IT를 | 001580/03 | 1 | 00147066 || 100 | 852.3 | 830.3 | 1.35 | UNIT | 55 | 31/12/2014 0시 IT | 001580/04 | 2 | 00254276 || 200 | 852.3 | 830.3 | 1.35 | UNIT | 0 | 31/12/2014 0시 IT | 001580/05 | 3 | 00305359 || 1700 | 852.3 | 830.3 | 1.35 | UNIT | 0 | 31/12/2014 0시 IT를 | 001580/06 | 3 | 00305359 || 300 | 852.3는 | 830.3 | 1.35 | UNIT | 1 | 0시
31/12/2014 그래서 내가 수행해야합니다
,536,913,632 10
- 하면 파일
- 넣은 다음 먼저 내가 테이블을 생성 단계와 내용은 표
- 삽입 표 2에 상세히
에 헤더를 읽어 A I는 SQL BulkInsert
CREATE TABLE #ImportData
(
Field VARCHAR(max)
)
-- Insert the data into the first table
BULK INSERT #ImportData
FROM 'PATH FILE'
WITH
(
ROWTERMINATOR = '\n'
)
사용
내가 이런 식으로 뭔가를 얻었다. (|)
우리는이 구분이있는 행이 볼, 즉, 각 테이블의 필드 의미 (HR - 헤더, IT - 세부)
은 다음 나의 두 번째와 세 번째 단계를 위해 내가 삽입 필요 각 테이블에 행,하지만 또한 내가 각 행의 각 필드를 구분해야합니다, 그래서 문자열과 구분 기호를 받아 내 문자열의 각 필드에있는 테이블을 반환하는 프로 시저를 작성, 나는 동적으로 필드를 만들었습니다. 프로 시저를 만들려면 당신이 그것을 만들 수 있습니다
당신은 그 다음 첫 번째 SET QUOTED_IDENTIFIER OFF
를 실행해야합니다. 프로 시저를 실행하고 아직 잘 우리가 완료되지이
같은 것을 얻을 수 있습니다 위해 내가 세 첫째 줄에 주석을 참조하면
--EXEC spSplit
-- @InputString = 'IT|001580/01|1|00147066||1200|852.3|830.3|1.35|QUANTITY|0|31/12/2014 00:00', -- VARCHAR(max)
-- @Delimiter = '|' -- VARCHAR(50)
--SET QUOTED_IDENTIFIER OFF
ALTER PROCEDURE spSplit
-- =============================================
-- Author: Gabriel Jiménez
-- Create date: 2013-01-16
-- Description: Procedimiento creado para retornar
-- valores de cada campo de una cadena delimitada
-- =============================================
@InputString NVARCHAR(max),
@Delimiter VARCHAR(50)
AS
BEGIN
SET QUOTED_IDENTIFIER OFF
CREATE TABLE #Items (Field1 VARCHAR(max))
DECLARE @Item VARCHAR(max)
DECLARE @ItemList VARCHAR(max)
DECLARE @DelimIndex INT
DECLARE @PositionField INT
DECLARE @SqlTable VARCHAR(max)
DECLARE @SqlUpdate VARCHAR(max)
SET @ItemList = @InputString
SET @DelimIndex = CHARINDEX(@Delimiter, @ItemList, 0)
SET @PositionField = 0
WHILE (@DelimIndex != 0)
BEGIN
SET @SqlTable = "ALTER TABLE #Items ADD Field"
SET @SqlUpdate = "UPDATE #Items SET Field"
-- Set positions Rows and Fields
SET @PositionField = @PositionField + 1
SET @Item = SUBSTRING(@ItemList, 0, @DelimIndex)
IF @PositionField = 1
BEGIN
-- Insert the first data into the first field created on the table
INSERT INTO #Items (Field1) VALUES (@Item)
END
ELSE
BEGIN
-- Create a dynamic table for the @InputString
SET @SqlTable = @SqlTable + CONVERT(VARCHAR, @PositionField)+ " VARCHAR(MAX)"
EXEC(@SqlTable)
SET @SqlUpdate = @SqlUpdate +
CONVERT(VARCHAR, @PositionField) + " = '" +
CONVERT(VARCHAR, @Item) +"'"
EXEC(@SqlUpdate)
END
-- Set @ItemList = @ItemList minus one less item
SET @ItemList = SUBSTRING(@ItemList, @DelimIndex+1, LEN(@ItemList)[email protected])
SET @DelimIndex = CHARINDEX(@Delimiter, @ItemList, 0)
END -- End WHILE
IF @Item IS NOT NULL -- At least one delimiter was encountered in @InputString
BEGIN
SET @SqlTable = "ALTER TABLE #Items ADD Field"
SET @SqlUpdate = "UPDATE #Items SET Field"
SET @SqlTable = @SqlTable + CONVERT(VARCHAR, @PositionField+1)+ " VARCHAR(MAX)"
EXEC(@SqlTable)
SET @SqlUpdate = @SqlUpdate +
CONVERT(VARCHAR, @PositionField+1) + " = '" +
CONVERT(VARCHAR, @ItemList) +"'"
EXEC(@SqlUpdate)
END
-- No delimiters were encountered in @InputString, so just return @InputString
ELSE
BEGIN
SET @SqlTable = "ALTER TABLE #Items ADD Field"
SET @SqlUpdate = "UPDATE #Items SET Field"
SET @SqlTable = @SqlTable + CONVERT(VARCHAR, @PositionField+1)+ " VARCHAR(MAX)"
EXEC(@SqlTable)
SET @SqlUpdate = @SqlUpdate +
CONVERT(VARCHAR, @PositionField+1) + " = '" +
CONVERT(VARCHAR, @InputString) +"'"
EXEC(@SqlUpdate)
END
SELECT * FROM #Items
SET QUOTED_IDENTIFIER ON
END -- End Procedure
GO
, 우리는 파일을 읽고, 우리는을 반환 절차를 작성 이제 우리는 그것을 위해 나는 각 테이블의 필드를 알고 다음에 커서 내 #ImporData 테이블에서 읽을 각 행에 대해 생성 두 개의 정적 필드 '원인과 임시 테이블을 생성, 필드는 각 테이블에 삽입해야합니다.
CREATE TABLE #Header
(
Field1 VARCHAR(max),
Field2 VARCHAR(max),
Field3 VARCHAR(max),
Field4 VARCHAR(max),
Field5 VARCHAR(max),
Field6 VARCHAR(max),
Field7 VARCHAR(max),
Field8 VARCHAR(max)
)
-- Detail table is for the detail items
CREATE TABLE #Detail
(
Field1 VARCHAR(max),
Field2 VARCHAR(max),
Field3 VARCHAR(max),
Field4 VARCHAR(max),
Field5 VARCHAR(max),
Field6 VARCHAR(max),
Field7 VARCHAR(max),
Field8 VARCHAR(max),
Field9 VARCHAR(max),
Field10 VARCHAR(max),
Field11 VARCHAR(max),
Field12 VARCHAR(max)
)
DECLARE @Field NVARCHAR(max)
DECLARE Header CURSOR
FOR SELECT Field
FROM #ImportData
WHERE SUBSTRING(Field,1,2) = 'HR'
OPEN Header
FETCH NEXT FROM Header INTO @Field
WHILE @@FETCH_STATUS = 0
BEGIN
INSERT INTO #Header
EXEC spSplit @Field, '|'
FETCH NEXT FROM Header INTO @Field
END
CLOSE Header
DEALLOCATE Header
--Detail
--DECLARE @f NVARCHAR(max)
DECLARE Detail CURSOR
FOR SELECT Field
FROM #ImportData
WHERE SUBSTRING(Field,1,2) = 'IT'
OPEN Detail
FETCH NEXT FROM Detail INTO @Field
WHILE @@FETCH_STATUS = 0
BEGIN
INSERT INTO #Detail
EXEC spSplit @Field, '|'
FETCH NEXT FROM Detail INTO @Field
END
CLOSE Detail
DEALLOCATE Detail
--SELECT * FROM #ImportData
SELECT * FROM #Header
SELECT * FROM #Detail
DROP TABLE #ImportData
DROP TABLE #Header
DROP TABLE #Detail
당신이있어 동일한 쿼리에있는 모든 조각 후 놓으면 그.
는 내가 필요로.
는 다시 한번 감사 Pondlife 나에게 분할에 대한 조언을 제공합니다.
그것은 당신이 whos는 요청하는지 이해하는 것은 매우 어렵다. 당신은 값으로 문자열을 분할로 그들에게 여러 테이블을 삽입하려고합니까? 내가 그렇게 할 수 때까지 나 방법을 이해합니다 ...하지만 난 결국 나를 도와하려고 ... 감사 대답을 얻었다 위해 내가 아는 –
엡 종류 어렵다. – GaboBigale