如何使用T-SQL读取文本文件?

jor*_*ame 9 sql t-sql

使用T-SQL读取文本文件的最佳方法是什么?我已经看过BULK INSERT和许多不同的功能,但它们不是我正在寻找的.

我需要读取文本文件中的每一行,然后将其插入到一个表中,其中包含一些其他信息,如文件名,文件位置,状态,创建的记录日期和时间等.

BULK INSERT不允许我添加额外的字段,除非我遗漏了一些内容.

任何帮助或指向正确的方向将非常感激.

Div*_*com 16

您可以批量插入临时表,然后执行另一个插入连接您要添加的数据.这是一个例子

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
Run Code Online (Sandbox Code Playgroud)

这不符合你的意愿吗?


Jam*_* L. 5

我使用一个非常简单的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
Run Code Online (Sandbox Code Playgroud)

例子

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')
Run Code Online (Sandbox Code Playgroud)

更多细节

像这样编译CLR DLL:

c:\windows\microsoft.net\framework\v3.5\vbc.exe /target:library MyFileIO.vb
Run Code Online (Sandbox Code Playgroud)

像这样注册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
Run Code Online (Sandbox Code Playgroud)

如果出现错误,则可能需要在db中启用CLR支持:

ALTER DATABASE [dbname] SET trustworthy ON
go
sp_configure 'clr enabled', 1
GO
RECONFIGURE
GO
Run Code Online (Sandbox Code Playgroud)

无论何时更改DLL,都必须删除过程和程序集,然后再次运行上面的代码以重新注册它.