2013-02-19 48 views
0

我試圖跟蹤SQL登錄成功和失敗並將它們存儲在SQL表中以用於查詢目的。我寫了一個可以工作的查詢,但是我的問題是,當登錄名包含域時,它可以正常工作,但如果它不包含域,則會附加額外的文本。我希望有人可以幫助我查看我的代碼,並瞭解如何在登錄名後刪除額外的代碼。從SQL錯誤日誌中的文本中提取登錄信息

什麼返回例: 域\ BBruning

域\ SQLServ

域\ BSMITH

域\ JHarris'。

scgWeb'。原因:F

cpadmin'。原因:

CREATE TABLE [dbo].[#TmpErrorLog] 
([LogDate] DATETIME NULL, 
[ProcessInfo] VARCHAR(20) NULL, 
[Text] VARCHAR(MAX) NULL); 

CREATE TABLE [dbo].[#TmpErrorLog2] 
([LogDate] DATETIME NULL, 
[ProcessInfo] VARCHAR(20) NULL, 
[Text] VARCHAR(MAX) NULL, 
[LoginAttempt] VARCHAR(20) NULL, 
[ServerName] VARCHAR(20) NULL); 


INSERT INTO #TmpErrorLog ([LogDate], [ProcessInfo], [Text]) 
EXEC [master].[dbo].[xp_readerrorlog] 0 ; 

INSERT INTO #TmpErrorLog2 ([LogDate], [ProcessInfo], [Text], [LoginAttempt]) 
Select LogDate, ProcessInfo, Text, SUBSTRING(Text,0,16) as LoginAttempt 
From #TmpErrorLog 
Where LogDate > GETDATE() - 120 and 
[ProcessInfo] = 'Logon' and 
Text like '%Login%' and text not like '%untrusted%' 



INSERT INTO [MyTABLE] ([LogDate], [LoginAttempt], [LoginUser], [ServerName], [Log_date_key]) 
Select 
LogDate, 
Case LoginAttempt When 'Login succeeded' Then 'Successful' ELSE 'Failed' End as LoginAttempt, 
SUBSTRING(SUBSTRING(Text, CHARINDEX('''', Text,1), CHARINDEX('''', Text, 0) - 4),2,50) as LoginUser, @@SERVERNAME, (Convert(INT, LogDate, 112)) 
From #TmpErrorLog2 
Where LogDate Not In(Select LogDate From [MyTable]) 



Drop Table #TmpErrorLog 
Drop Table #TmpErrorLog2 

回答

2

您的子字符串使用情況在最終選擇中有點偏離。

你有

SUBSTRING(SUBSTRING(Text, CHARINDEX('''', Text,1), CHARINDEX('''', Text, 0) - 4),2,50) 

,你需要的是

SUBSTRING(
    Text, 
    CHARINDEX('''', Text,1)+1, 
    CHARINDEX('''', Text, CHARINDEX('''', Text,1)+1) - CHARINDEX('''', Text,1)-1 
) 

你正在提供一個起始位置和結束位置,TSQL需要的起始位置,並且您希望返回的字符串的長度。

+0

Robb,你是男人。這很好。謝謝您的幫助!! – 2013-02-19 16:46:33