By Frank Kalis
Definitiv etwas auf meiner persönlichen SQL Server Wish List. Es wäre schön, wenn man diese Information ähnlich wie HOST_NAME() abfragen könnte.
set nocount on declare @ip varchar(255), @cmd varchar(100) set @cmd = 'ping -n 1 ' + HOST_NAME() create table #temptb (grabfield varchar(255)) insert into #temptb exec master.dbo.xp_cmdshell @cmd select @ip = substring(grabfield, charindex('[',grabfield)+1, charindex(']',grabfield)-charindex('[',grabfield)-1) from #temptb where left(grabfield,7) = 'Pinging' print @ip drop table #temptb set nocount off
Das obige Beispiel funktioniert, wenn man die englischen Softwareversionen einsetzt. Setzt man hingegen die deutschsprachigen Versionen ein, muß man die obige WHERE Bedingung durch folgende ersetzen:
where left(grabfield,5) ='Ping '
Anmerkung 09.12.2004: Auf SQL Server Central hat mich AJ Ahrens auf den kleinen, aber netten Parameter Ping -n 1 hingewiesen. Dieser bewirkt, daß nur ein Ping abgesetzt wird, anstelle der üblichen 4.
Anmerkung 14.12.2004: SQL Server MVP Kenneth Wilhelmsson hat in dem oben erwähnten Thread folgenden Lösungsvorschlag gepostet:
create table #ipconfig ( conf varchar(100) null ) insert #ipconfig exec master..xp_cmdshell 'ipconfig' declare @ip varchar(15), @mask varchar(15) select @ip = right(conf, charindex(':', reverse(conf)) -1) from #ipconfig where patindex('%IP Address%', conf) > 0 select @mask = right(conf, charindex(':', reverse(conf)) -1) from #ipconfig where patindex('%Subnet Mask%', conf)> 0 select ltrim(@ip) as ip, ltrim(@mask) as mask drop table #ipconfig go ip mask --------------- --------------- 130.XXX.XXX.XXX 255.XXX.0.0 (1 row(s) affected)
Wenn man die deutschen Versionen einsetzt, muß man folgende Änderungen vornehmen:
where patindex('%IP-Adresse%', conf) > 0und
where patindex('%Subnetzmaske%', conf)> 0
um das Skript zum Laufen zu bringen. Und, zu guter Letzt, hat Razvan Socol noch eine dritte interessante Lösung präsentiert.
CREATE TABLE #ErrLog (errorlog varchar(8000), ContinuationRow int) INSERT INTO #ErrLog EXEC sp_readerrorlog SELECT SUBSTRING(errorlog, CHARINDEX('SQL server listening on ',errorlog)+24, CHARINDEX(': ',errorlog)-CHARINDEX('SQL server listening on ',errorlog)-24) FROM #ErrLog WHERE errorlog LIKE '%SQL server listening on %:%' DROP TABLE #ErrLog ---------------- 130.XXX.XXX.XXX 127.0.0.1 (2 row(s) affected)
Hier lediglich noch zusätzlich der Hinweis, daß sp_readerrorlog undokumentiert ist. Setzt man deutsche Versionen eine, muß der Batch folgendermaßen formuliert werden:
CREATE TABLE #ErrLog (errorlog varchar(8000), ContinuationRow int) INSERT INTO #ErrLog EXEC sp_readerrorlog SELECT SUBSTRING(errorlog, CHARINDEX('SQL Server überwacht ',errorlog)+21, CHARINDEX(': ',errorlog)-CHARINDEX('SQL Server überwacht ',errorlog)-21) FROM #ErrLog WHERE errorlog LIKE '%SQL Server überwacht %:%' DROP TABLE #ErrLog
Update 10.10.2007: Glücklicherweise ist im SQL Server 2005 alles anders :
SELECT client_net_address FROM sys.dm_exec_connections WHERE session_id=@@spid