11

T-SQL を使用してテキスト ファイルを読み取る最良の方法は何ですか? BULK INSERT とさまざまな機能を見てきましたが、探しているものはありません。

テキスト ファイルの各行を読み取り、ファイル名、ファイルの場所、ステータス、作成日時などの他の情報を含むテーブルに挿入する必要があります。

BULK INSERT では、何か不足していない限り、フィールドを追加することはできません。

どんな助けや正しい方向を指していても、本当に感謝しています。

4

5 に答える 5

18

おそらく、一時テーブルに一括挿入してから、追加するデータと結合する別の挿入を行うことができます。ここに例があります

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

これはあなたが望むことをしませんか?

于 2012-09-19T20:32:02.077 に答える
5

ファイル全体を読み取り、行を行に分割する、非常に単純な CLR プロシージャを使用して、値の 1 列のテーブルを返します。前述したように、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

エラーが発生した場合は、データベースで CLR サポートを有効にする必要がある場合があります。

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

DLL を変更するたびに、プロシージャとアセンブリを削除し、上記のコードを再度実行して再登録する必要があります。

于 2012-09-19T20:33:02.497 に答える
2

Integration Services(SSIS)を使用できます

リンク : http://msdn.microsoft.com/en-us/library/ms141026.aspx

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

于 2012-09-19T20:28:00.143 に答える
1

これは、 を使用FORMATFILEして実行できます。フォーマット ファイルを使用する場合、列をスキップできます。フォーマット ファイルを使用する利点は他にもたくさんあります。

以下のクエリは、行を field に一括ロードしますLine

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>
于 2012-09-20T00:02:58.047 に答える
1

SQL Server で OLE オートメーションが有効になっている場合 (多くのサイトがセキュリティ上の理由で OLE オートメーションを無効にしている場合、これは大きな問題です)、sp_OACreateおよび関連する関数FileSystemObjectを使用してスクリプトのインスタンスを作成できます。

于 2012-09-19T20:33:03.143 に答える