使用T-SQL读取文本文件的最佳方法是什么?我已经看过BULK INSERT和许多不同的功能,但不是我们正在寻找的功能。
我需要读取文本文件中的每一行,然后将其插入到一个表中,其中包含一些其他信息,如文件名,文件位置,状态,记录日期和时间。创造时间等。
BULK INSERT不允许我添加额外的字段,除非我在此遗漏了一些内容。
任何帮助或指出正确的方向都会非常感激。
答案 0 :(得分:14)
您可以批量插入临时表,然后再添加要添加的数据的插入。这是一个例子
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
这不符合您的要求吗?
答案 1 :(得分: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
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,都必须删除过程和程序集,然后再次运行上面的代码重新注册。
答案 2 :(得分: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
答案 3 :(得分:1)
如果在SQL Server中启用了OLE自动化(如果有许多站点出于安全原因禁用它,则它很大),您可以使用sp_OACreate和相关功能创建脚本FileSystemObject
的实例。
答案 4 :(得分:1)
这可以使用FORMATFILE
完成。使用格式文件时,您可以跳过列。使用格式文件还有很多其他优点。
以下查询会将这些行批量加载到字段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>