T-SQL を使用してテキスト ファイルを読み取る最良の方法は何ですか? BULK INSERT とさまざまな機能を見てきましたが、探しているものはありません。
テキスト ファイルの各行を読み取り、ファイル名、ファイルの場所、ステータス、作成日時などの他の情報を含むテーブルに挿入する必要があります。
BULK INSERT では、何か不足していない限り、フィールドを追加することはできません。
どんな助けや正しい方向を指していても、本当に感謝しています。
おそらく、一時テーブルに一括挿入してから、追加するデータと結合する別の挿入を行うことができます。ここに例があります
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
これはあなたが望むことをしませんか?
ファイル全体を読み取り、行を行に分割する、非常に単純な 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 を変更するたびに、プロシージャとアセンブリを削除し、上記のコードを再度実行して再登録する必要があります。
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
これは、 を使用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>
SQL Server で OLE オートメーションが有効になっている場合 (多くのサイトがセキュリティ上の理由で OLE オートメーションを無効にしている場合、これは大きな問題です)、sp_OACreateおよび関連する関数FileSystemObject
を使用してスクリプトのインスタンスを作成できます。