복붙노트

[SQL] 어떻게 T-SQL을 사용하여 텍스트 파일을 읽을 수?

SQL

어떻게 T-SQL을 사용하여 텍스트 파일을 읽을 수?

T-SQL을 사용하여 텍스트 파일을 읽을 수있는 가장 좋은 방법은 무엇입니까? 나는 대량 삽입 많은 다른 기능을 본 적이 있지만 비는 내가 무엇을 찾고 있습니다.

나는 텍스트 파일의 각 줄을 읽은 다음 등의 파일 이름, filelocation, 상태, 생성 된 기록 날짜와 시간, 같은 몇 가지 다른 정보가있는 테이블에 삽입 할 필요가

벌크 INSERT 내가이 뭔가를보고 싶어하지 않는 나 추가 필드를 추가 할 수 없습니다.

올바른 방향을 가리키는 어떤 도움이나 정말 감사합니다.

해결법

  1. ==============================

    1.당신은 아마 임시 테이블에 대량 삽입을하고 다음 추가 할 데이터와 결합 다른 삽입 할 수 있습니다. 다음 예는

    당신은 아마 임시 테이블에 대량 삽입을하고 다음 추가 할 데이터와 결합 다른 삽입 할 수 있습니다. 다음 예는

    CREATE TABLE #TEXTFILE_1(
        FIELD1 varchar(100) ,
        FIELD2 varchar(100) ,
        FIELD3 varchar(100) ,
        FIELD4 varchar(100));
    
    BULK INSERT #TEXTFILE_1 FROM 'C:\STUFF.TXT'
    WITH (FIELDTERMINATOR =' | ',ROWTERMINATOR =' \n')
    
    /*You now have your bulk data*/
    
    insert into yourtable (field1, field2, field3, field4, field5, field6)
    select txt.FIELD1, txt.FIELD2, txt.FIELD3, txt.FIELD4, 'something else1', 'something else2' 
    from #TEXTFILE_1 txt
    
    drop table #TEXTFILE_1
    

    이것은 당신이하고 싶은 일을하지 않습니다?

  2. ==============================

    2.값의 1 열 테이블을 반환 - I 행에 줄을 전체 파일을 읽고 분리하는 매우 간단한 CLR 절차를 사용합니다. 내가 말했듯이, CLR이 코드는 매우 간단합니다 :

    값의 1 열 테이블을 반환 - I 행에 줄을 전체 파일을 읽고 분리하는 매우 간단한 CLR 절차를 사용합니다. 내가 말했듯이, CLR이 코드는 매우 간단합니다 :

    [MyFileIO.vb]
    
    Imports System
    Imports System.IO
    Imports System.Data
    Imports System.Data.SqlClient
    Imports System.Data.SqlTypes
    Imports Microsoft.SqlServer.Server
    Imports System.Collections
    Imports System.Runtime.InteropServices
    
    Partial Public Class TextFiles
        <Microsoft.SqlServer.Server.SqlFunction(FillRowMethodName:="GetNextSplitString")> _
        Public Shared Function FileToTable(ByVal FileName As String) As IEnumerable
    
            Dim s() As String
    
            Using sr As New StreamReader(FileName)
                s = Split(sr.ReadToEnd, vbCrLf)
            End Using
    
            Return s
        End Function
    
    
        Public Shared Sub GetNextSplitString(ByVal Value As Object, <Out()> ByRef Data As SqlChars)
            Data = New SqlChars(CType(Value, String))
        End Sub
    End Class
    
    select *, getdate() as [CreateDate], 1 as [AnotherColumn], 'xyz' as [ETC]
    from dbo.FileToTable('c:\file.ext')
    
    select line, left(line, 10), right(line, 10)
    from dbo.FileToTable('c:\file.ext')
    
    select ...
    into [tablename]
    from dbo.FileToTable('c:\file.ext')
    

    이 같은 CLR DLL을 컴파일

    c:\windows\microsoft.net\framework\v3.5\vbc.exe /target:library MyFileIO.vb
    

    이 같은 CLR DLL을 등록 :

    create assembly MyFileIO from 'c:\MyFileIO.dll' with permission_set = unsafe
    go
    create function dbo.FileToTable (@FileName nvarchar(255)) returns table (line nvarchar(max)) as external name MyFileIO.TextFiles.FileToTable
    go
    

    오류가 발생하면, 당신은 DB에서 CLR 지원을 활성화해야 할 수도 있습니다 :

    ALTER DATABASE [dbname] SET trustworthy ON
    go
    sp_configure 'clr enabled', 1
    GO
    RECONFIGURE
    GO
    

    당신이 DLL을 변경할 때마다, 당신은 다시 조립 절차 등을 삭제하고 위의 코드를 실행해야 함을 다시 등록합니다.

  3. ==============================

    3.당신은 통합 서비스 (SSIS)를 사용할 수 있습니다

    당신은 통합 서비스 (SSIS)를 사용할 수 있습니다

    링크 : http://msdn.microsoft.com/en-us/library/ms141026.aspx

    링크 : http://technet.microsoft.com/en-us/library/ms169917%28v=sql.105%29.aspx

  4. ==============================

    4.OLE 자동화가 SQL 서버에서 사용할 (그리고 큰 많은 사이트가 보안상의 이유로 사용하지 않도록 설정 같은 경우의) 경우, 당신은 통해 sp_OACreate 및 관련 기능을 사용하여 스크립팅 FileSystemObject를의 인스턴스를 만들 수 있습니다.

    OLE 자동화가 SQL 서버에서 사용할 (그리고 큰 많은 사이트가 보안상의 이유로 사용하지 않도록 설정 같은 경우의) 경우, 당신은 통해 sp_OACreate 및 관련 기능을 사용하여 스크립팅 FileSystemObject를의 인스턴스를 만들 수 있습니다.

  5. ==============================

    5.이것은 당신이 열을 건너 뛸 수 있습니다 형식 파일을 사용하여 FORMATFILE .When를 사용하여 수행 할 수 있습니다. 형식 파일을 사용하는 많은 장점이있다.

    이것은 당신이 열을 건너 뛸 수 있습니다 형식 파일을 사용하여 FORMATFILE .When를 사용하여 수행 할 수 있습니다. 형식 파일을 사용하는 많은 장점이있다.

    필드 라인에 라인 쿼리 의지의 대량로드 아래.

    CREATE TABLE TextFile
        (
        [Line] varchar(500) ,
        [FileName] varchar(100) ,
        [RecordDate] DATETIME DEFAULT GETDATE(),
        [RecordID] INT IDENTITY(1,1) ,
        )
    
        BULK INSERT TextFile FROM 'C:\FILE.TXT'
        WITH (FORMATFILE = 'C:\FILEFORMAT.XML')
    

    위의 질의에 사용 된 형식 파일은 다음과 같습니다

    <?xml version="1.0"?>
    <BCPFORMAT xmlns="http://schemas.microsoft.com/sqlserver/2004/bulkload/format" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <RECORD>  
      <FIELD ID="1" xsi:type="CharTerm" TERMINATOR="\r\n" MAX_LENGTH="500" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
     </RECORD>
     <ROW>
      <COLUMN SOURCE="1" NAME="Line" xsi:type="SQLVARYCHAR"/>
     </ROW>
    </BCPFORMAT>
    
  6. from https://stackoverflow.com/questions/12502213/how-to-read-a-text-file-using-t-sql by cc-by-sa and MIT license