0

SQLログインの成功と失敗を追跡し、クエリの目的でSQLテーブルに保存しようとしています。動作するクエリを作成しましたが、問題は、ログイン名にドメインが含まれている場合は正常に動作しますが、ドメインが含まれていない場合は余分なテキストが追加されることです。誰かが私のコードを確認し、ログイン名の後に余分なものを削除する方法を確認するのを手伝ってくれることを望んでいました。

返されるものの例:Domain \ BBruning

Domain \ SQLServ

Domain \ BSmith

Domain \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
4

1 に答える 1

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には、返される開始位置と文字列の長さが必要です。

于 2013-02-19T16:41:07.230 に答える