我使用批量插入来获取.txt
文件并将其导入SQL Server数据库。
该表定义为:
CREATE TABLE dbo.server1
(
[DATE] [VARCHAR] (16) NULL,
[TIME] [VARCHAR] (16) NULL,
[s-ip] [VARCHAR] (16) NULL,
[cs-method] [VARCHAR] (8) NULL,
[cs-uri-stem] [VARCHAR] (255) NULL,
[cs-uri-query] [VARCHAR] (2048) NULL,
[s-port] [VARCHAR] (4) NULL,
[s-username] [VARCHAR] (50) NULL,
[c-ip] [VARCHAR] (16) NULL,
[cs(User-Agent)] [VARCHAR] (1024) NULL,
[cs(Cookie)] [VARCHAR] (1024) NULL,
[cs(Referer)] [VARCHAR] (4096) NULL,
[sc-STATUS] [INT] NULL,
[sc-substatus] [INT] NULL,
[sc-win32-STATUS] [INT] NULL,
[sc-bytes] [DECIMAL] NULL,
[cs-bytes] [DECIMAL] NULL,
[time-taken] [INT] NULL,
)
批量插入
BULK INSERT dbo.server1
FROM 'C:\Users\User\Desktop\log.txt'
WITH (
FIRSTROW = 2,
FIELDTERMINATOR = ' ',
ROWTERMINATOR = '\n'
)
.txt
文件看起来像(IIS Log)
#Software: Microsoft Internet Information Services 7.5
#Version: 1.0
#Date: 2017-05-31 00:00:00
#Fields: date time s-ip cs-method cs-uri-stem cs-uri-query s-port cs-username c-ip cs(User-Agent) cs(Cookie) cs(Referer) sc-status sc-substatus sc-win32-status sc-bytes cs-bytes time-taken
2017-05-31 00:00:00 ::1 POST /support/webservice/BatchService.asmx - 80 - ::1 Mozilla/4.0+(compatible;+Win32;+WinHttp.WinHttpRequest.5) - - 401 2 5 6765 629 2
2017-05-31 00:05:15 ::1 POST /support/webservice/BatchService.asmx - 80 AD\wmisbatch ::1 Mozilla/4.0+(compatible;+Win32;+WinHttp.WinHttpRequest.5) - - 200 0 0 734 820 314898
2017-05-31 01:00:00 ::1 POST /support/webservice/BatchService.asmx - 80 - ::1 Mozilla/4.0+(compatible;+Win32;+WinHttp.WinHttpRequest.5) - - 401 2 5 6765 629 1
我的问题是我没有主键,需要检查整行是否存在。我没有插入具体的值,因为我已经找到了很多两个例子。我问的原因是因为我可能想要手动或预定运行bulk insert
而不想要重复数据。
当我没有主键或插入特定值时,执行not exists
或过程的最佳方法是什么?
我有一个使用Union
和临时表的解决方案,但我想尽可能避免这种情况。