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