2017-09-22 1 views
0

.logファイルからデータを照会しようとしています。すべてのスキーマはファイルと完全に同じですが、依然として私のクエリは行が有効でないという応答を返します。私のSQLスキーマを次に示しバルクファイルでクエリの問題

date-time,client-ip,client-hostname,server-ip,server-hostname,source-context,connector-id,source,event-id,internal-message-id,message-id,recipient-address,recipient-status,total-bytes,recipient-count,related-recipient-address,reference,message-subject,sender-address,return-path,message-info,directionality,tenant-id,original-client-ip,original-server-ip,custom-data 2017-08-23T00:00:08.631Z,10.10.30.112,xyz.domain.COM,172.16.0.25,ISIL1,08D4E23F10F7AE79;2017-08-23T00:00:05.760Z;0,ISB\Default ISBEX,SMTP,RECEIVE,702862,<[email protected]>,[email protected];[email protected];[email protected],134,3,Secure Message Delivery,[email protected],[email protected],0cI: ,Originating,15.0.30.5,15.1.0.20,S:[email protected];S:FirstForestHop=as.xyz.COM

CREATE TABLE [dbo].[LogTest] 
(
    [date-time] VARCHAR(max) NULL, 
    [client-ip] VARCHAR(max) NULL, 
    [client-hostname] VARCHAR(max) NULL, 
    [server-ip] VARCHAR(max) NULL, 
    [server-hostname] VARCHAR(max) NULL, 
    [source-context] VARCHAR(max) NULL, 
    [connector-id] VARCHAR(max) NULL, 
    [source] VARCHAR(max) NULL, 
    [event-id] VARCHAR(max) NULL, 
    [internal-message-id] VARCHAR(max) NULL, 
    [message-id] VARCHAR(max) NULL, 
    [recipient-address] VARCHAR(max) NULL, 
    [recipient-status] VARCHAR(max) NULL, 
    [total-bytes] VARCHAR(max) NULL, 
    [recipient-count] VARCHAR(max) NULL, 
    [related-recipient-address] VARCHAR(max) NULL, 
    [reference] VARCHAR(max) NULL, 
    [message-subject] VARCHAR(max) NULL, 
    [sender-address] VARCHAR(max) NULL, 
    [return-path] VARCHAR(max) NULL, 
    [message-info] VARCHAR(max) NULL, 
    [directionality] VARCHAR(max) NULL, 
    [tenant-id] VARCHAR(max) NULL, 
    [original-client-ip] VARCHAR(max) NULL, 
    [original-server-ip] VARCHAR(max) NULL, 
    [custom-data] VARCHAR(max) NULL 
) 

    Bulk 
     Insert LogTest 
     From 'C:\Users\zz\Desktop\asy.log' 
     with 
     (
     Fieldterminator = ',', 

     Rowterminator = '/t' 
    ) 
+0

SQL-Serverの!= MySQLの – Barmar

答えて

0

サンプルデータは行ごとに異なる数の列が含まれています以下は、私の.logファイル構造です。行1、ヘッダーは、26列を含み、第2行は、データが22列のみを含む。したがって、2行目にさらに4列を追加し、デフォルトのRowTerminatorを受け入れると、コードはOKです。

date-time,client-ip,client-hostname,server-ip,server-hostname,source-context,connector-id,source,event-id,internal-message-id,message-id,recipient-address,recipient-status,total-bytes,recipient-count,related-recipient-address,reference,message-subject,sender-address,return-path,message-info,directionality,tenant-id,original-client-ip,original-server-ip,custom-data 
2017-08-23T00:00:08.631Z,10.10.30.112,xyz.domain.COM,172.16.0.25,ISIL1,08D4E23F10F7AE79;2017-08-23T00:00:05.760Z;0,ISB\Default ISBEX,SMTP,RECEIVE,702862,<[email protected]>,[email protected];[email protected];[email protected],134,3,Secure Message Delivery,[email protected],[email protected],0cI: ,Originating,15.0.30.5,15.1.0.20,S:[email protected];S:FirstForestHop=as.xyz.COM,23,24,25,26 

create TABLE #LogTest 
(
[date-time] VARCHAR(max) NULL, 
[client-ip] VARCHAR(max) NULL, 
[client-hostname] VARCHAR(max) NULL, 
[server-ip] VARCHAR(max) NULL, 
[server-hostname] VARCHAR(max) NULL, 
[source-context] VARCHAR(max) NULL, 
[connector-id] VARCHAR(max) NULL, 
[source] VARCHAR(max) NULL, 
[event-id] VARCHAR(max) NULL, 
[internal-message-id] VARCHAR(max) NULL, 
[message-id] VARCHAR(max) NULL, 
[recipient-address] VARCHAR(max) NULL, 
[recipient-status] VARCHAR(max) NULL, 
[total-bytes] VARCHAR(max) NULL, 
[recipient-count] VARCHAR(max) NULL, 
[related-recipient-address] VARCHAR(max) NULL, 
[reference] VARCHAR(max) NULL, 
[message-subject] VARCHAR(max) NULL, 
[sender-address] VARCHAR(max) NULL, 
[return-path] VARCHAR(max) NULL, 
[message-info] VARCHAR(max) NULL, 
[directionality] VARCHAR(max) NULL, 
[tenant-id] VARCHAR(max) NULL, 
[original-client-ip] VARCHAR(max) NULL, 
[original-server-ip] VARCHAR(max) NULL, 
[custom-data] VARCHAR(max) NULL 
) 

    Bulk 
     Insert #LogTest 
     From 'C:\test.log' 
     with 
     (
     Fieldterminator = ',' 
--  ,Rowterminator = '/r/n' 
    ) 

select * from #LogTest 

UPDATE

いくつかの行がヌルしている場合は、バルクは、実際のテーブルの前に一時的な1列のテーブルに挿入することができます。テンポラリテーブルから非ヌル行のみを準備し、カラムを解析して実際のテーブルに出力します。

Create table #Temp (LongColumn Varchar(max)) 
BULK INSERT #Temp FROM 'C:\Test.Log'; 

with tmp as(
    select ROW_NUMBER()over(order by (select null)) as RowNo, 
      LongColumn 
    from #Temp as a 
    WHERE a.LongColumn is NOT NULL 
    ), cols as(
    select a.RowNo 
      , ROW_NUMBER() over(partition by RowNo order by (select null)) as ColNo 
      , b.value 
    from tmp as a 
    cross apply STRING_SPLIT(a.LongColumn, ',') as b 
)insert into #LogTest 
select 
     [1], [2], [3], [4], [5], [6], [7], [8], [9], [10] 
     ,[11], [12], [13], [14], [15], [16], [17], [18], [19], [20] 
     ,[21], [22], [23], [24], [25], [26] 
from 
(
    select RowNo, value, ColNo 
    from cols 
) src 
pivot 
(
    max(value) 
    for ColNo in ([1], [2], [3], [4], [5], [6], [7], [8], [9], [10] 
     ,[11], [12], [13], [14], [15], [16], [17], [18], [19], [20] 
     ,[21], [22], [23], [24], [25], [26]) 
) p 
order by p.RowNo 
; 
+0

おかげで、今や完全に取り組ん – ali

+0

私持っているもう一つの問題は、今の私の行のいくつかは、私がNULL値を持つすべての行を削除するnull値を持っています? – ali

+0

@ali、いくつかの行がNULL、つまり26列ではなく1つのNULL列の場合、この表からファイルを1つの列表に読み込み、NULL行をフィルタ・アウトし、有効な行を列に解析する必要があります。列の長さが固定長であれば、これはほとんど簡単になりません。 –