4

我必须从 SQL Server 中的 IP 地址获取机器名称,我可以做些什么来完成我的任务

4

8 回答 8

2

您不能在 SQL 语言中本地执行此操作,最好的选择是:

1/ 通过 xp-cmdshell 脱壳并运行 nslookup,这将需要一些字符串操作以正确获取命令,然后对输出进行一些清理以返回机器名称

2/ 编写一个 C# CLR 函数,将 IP 地址作为输入,并利用 Dns.GetHostEntry 方法解析并返回名称。

有关文档,请参见此处:

Dns.GetHostEntry 方法

我写了一个非常快速简单的 CLR 函数,用于从 IP 地址获取机器名称如下,请注意在尝试解析之前没有错误处理或输入检查以确保 IP 有效,它不会给你如果您将主机名传递给 IP 地址,则可以轻松修改它以包含所有这些内容,这只是为了让您了解它是如何工作的:

using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
using System.Net;

public partial class UserDefinedFunctions
{
    [Microsoft.SqlServer.Server.SqlFunction]
    public static SqlString dnsResolve(String ipAddress)
    {
        IPHostEntry host = Dns.GetHostEntry(ipAddress);
        return new SqlString(host.HostName.ToString());
    }
}
于 2013-04-08T09:48:37.913 回答
2

D B:

IPAdd | MachineName

询问:

select MachineName from DBTable where IPAdd='yourIPAddress'

尝试:

SELECT SERVERPROPERTY('MachineName')

或者

SELECT  
   CONNECTIONPROPERTY('net_transport') AS net_transport,
   CONNECTIONPROPERTY('protocol_type') AS protocol_type,
   CONNECTIONPROPERTY('auth_scheme') AS auth_scheme,
   CONNECTIONPROPERTY('local_net_address') AS local_net_address,
   CONNECTIONPROPERTY('local_tcp_port') AS local_tcp_port,
   CONNECTIONPROPERTY('client_net_address') AS client_net_address 

或者

SELECT @@SERVERNAME;

参考:

http://msdn.microsoft.com/en-us/library/ms187944.aspx

希望它有帮助。

于 2013-04-08T07:01:09.263 回答
1

您想要的称为反向 DNS 查找。有可以执行此操作的命令行工具 ( nslookup.exe ),或者您可以使用DnsQueryAPI。你在 T-SQL 中没有任何业务,所以不要尝试这样做。在客户端解析要命名的IP。

于 2013-04-08T08:37:19.243 回答
1

我可能错了,但据我所知,SQL Server 不能做你想做的事。从 IP 地址解析机器名称是您网络的 DNS 服务器所做的事情。

我想出从 SQL Server 获取该信息的最佳想法是使用xp_cmdshell命令从 SQL 执行命令提示符命令。

xp_cmdshell 'NBTSTAT -A 10.10.10.10'

但是,请注意 xp_cmdshell 需要首先在您的服务器上启用才能工作,而且通常不是因为可能存在安全问题。在http://msdn.microsoft.com/en-us/library/ms175046.aspx阅读有关 xp_cmdshell 的更多信息

此外,由此产生的结果就像来自命令提示符一样,需要进行一些解析才能从中获取准确的机器名称。检查此主题以获取更多信息:从 XP_CMDSHELL 获取结果

我不知道您的解决方案架构以及如何获取 IP 地址,但如果它来自某些客户端应用程序,则可能更容易找到SELECT HOST_NAME()从客户端查询或使用 .NET 执行的客户端机器名称并直接发送机器名称。

于 2013-04-08T08:06:22.057 回答
0
--Im using command line for checking host name after IP
declare @IP as varchar(15)
declare @cmd as varchar(1000) 
set @IP='192.168.0.1' 
SET @cmd = 'ping -a -n 1 ' + @IP 
Create Table #Output (Output varchar(150) default(''))
INSERT INTO #Output 
EXEC xp_cmdshell @cmd 
Begin try 
Select top 1 Replace(LEFT([Output],CHARINDEX('[', [output])-2),'Pinging ','') as HostName from #Output where Output is not null 
End Try 
Begin catch 
Select 'Host name for:' + @IP +' could not be find'
End catch 
drop table #Output 
于 2013-04-08T08:31:08.703 回答
0

你可以试试这个来获取你的机器的名字。

SELECT SERVERPROPERTY(N'MachineName');

可能上面可以达到你的目的。

于 2013-04-08T07:05:56.993 回答
0

这实际上有效:Sky Diver 的修改答案

--Im using command line for checking host name after IP
    declare @IP as varchar(15)
    declare @cmd as varchar(1000) 
    set @IP='137.201.17.204' 
    SET @cmd = 'ping -a -n 1 ' + @IP 
    Create Table #Output (Output varchar(150) default(''))
    INSERT INTO #Output 
    EXEC xp_cmdshell @cmd 
    Begin try 
    Select top 1 Replace(LEFT([Output],CHARINDEX('[', [Output])-2),'Pinging ','') as HostName from #Output where Output like 'Pinging%'
    End Try 
    Begin catch 
    Select 'Host name for:' + @IP +' could not be find'
    End catch 
    --drop table #Output 
于 2015-05-18T16:43:49.760 回答
0

试试这个你会得到一个系统名称......

选择主机名()

问候:Rajsri Vyshnnavi

于 2015-08-07T10:32:55.040 回答