【问题标题】:How to get machine name from ip address in SQL Server 2008?如何从 SQL Server 2008 中的 IP 地址获取机器名称?
【发布时间】:2013-04-08 06:58:29
【问题描述】:

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

【问题讨论】:

  • OP原本想从登录Instance的IP中查找机器地址或名称。

标签: sql sql-server


【解决方案1】:

数据库:

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

希望对您有所帮助。

【讨论】:

  • 其实这不是我的情况,我有动态IP,我必须动态获取IP。
  • 那么您将不得不提及您正在使用的编程语言。
  • 我有一个 IP 地址,我需要在 MSSQL 中从该 IP 地址获取机器名称
  • 机器名称存储在数据库中?
  • 那么上面的查询有什么问题??你能分享[粘贴]数据库结构吗?
【解决方案2】:

我可能错了,但据我所知,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 的信息

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

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

【讨论】:

    【解决方案3】:

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

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

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

    查看文档:

    Dns.GetHostEntry Method

    我写了一个非常快速简单的 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());
        }
    }
    

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:
        --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 
        

        【讨论】:

          【解决方案6】:

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

          SELECT SERVERPROPERTY(N'MachineName');
          

          也许上面可以达到你的目的。

          【讨论】:

          • 对不起,这不是我要找的,我只是想解析机器名中的 IP 地址
          【解决方案7】:

          这确实有效:来自 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 
          

          【讨论】:

          【解决方案8】:

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

          选择 HOST_NAME()

          问候:Rajsri Vyshnnavi

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-04-14
            • 2013-03-27
            • 1970-01-01
            • 2017-05-24
            • 2012-05-31
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多