0

SQL Server テーブルに大きな文字列があります。

例 1 レコード テーブル行:

06.10.2013 22:49:25 [Server Name] INFO - received /192.168.77.14:45643 User-Name: Jon Johnson still something between Client IP: 172.29.5.43

しかし、私はちょうど必要です:

06.10.2013 22:49:25 User-Name: Jon Johnson Client IP: 172.29.5.43

どうすればいいですか?私はPATINDEXで試しましたが:\

4

4 に答える 4

1
SELECT 
LEFT(c, 19) -- fixed length for date-time
+ ' ' -- separator
-- now let's find the user-name.
+ SUBSTRING(c, CHARINDEX('User-Name:',c), CHARINDEX(' still something',c ) - CHARINDEX('User-Name:',c)) -- 'User-name:' string must be present only once in the row-column. Replace ' still something' string with the actual content. You use it to delimit the username itself.
+ ' ' -- separator
+ SUBSTRING(c, CHARINDEX('Client IP:',c) /* first character position to include */, LEN(c) - CHARINDEX('Client IP:',c) + 1 /* last character position not to include */) -- 'Client IP:' string must be resent only once in the row-column. Expects the IP to be the last part of the string, otherwise use the technique from the username

-- now the dummy table for the testing
FROM 
(SELECT '06.10.2013 22:49:25 [Server Name] INFO - received /192.168.77.14:45643 User-Name: Jon Johnson still something between Client IP: 172.29.5.43' AS c) AS t
于 2013-10-10T07:59:32.807 に答える
0

列の日付部分は固定されているため、関数を使用して固定長を抽出できますSUBSTRING

完全なクエリは次のとおりです。

SELECT SUBSTRING(fieldname,1,20) + SUBSTRING(fieldname, CHARINDEX('User-Name', 

fieldname), LENGTH(fieldname)-CHARINDEX('User-Name', fieldname)) from table;  
于 2013-10-10T07:57:56.403 に答える
0

文字列が正しい形式の場合 (サーバー名とユーザー名のトークンが常に見つかります)、PATINDEX を適用して必要なインデックスを取得し、次のように SUBSTIRNG を適用できます。

Sql フィドルを表示

select
substring(description, 1, patindex('%Server Name%', description) - 3) +
substring(description, patindex('%User-name%', description) + 9, 500)
from myTable
于 2013-10-10T07:49:32.700 に答える
0

これはうまくいくかもしれませんが、その「まだ間にある」をより堅実なものに置き換える必要があります。

DECLARE @s NVARCHAR(MAX)
SET @s = '06.10.2013 22:49:25 [Server Name] INFO - received /192.168.77.14:45643 User-Name: Jon Johnson still something between Client IP: 172.29.5.43'


SELECT SUBSTRING(@s,0,CHARINDEX('[Server Name]',@s)) --everything up to [Server Name]
   + SUBSTRING(@s, CHARINDEX('User-Name',@s),CHARINDEX('still something between', @s)-CHARINDEX('User-Name',@s)) --everything from User-Name to 'still something between'
   + SUBSTRING(@s, CHARINDEX('Client IP',@s),LEN(@s)) --from Client IP till the end
于 2013-10-10T08:00:18.790 に答える