SQL Server

时间:2017-07-18 13:48:51

标签: sql sql-server dns

我在一列中有一个包含IP地址列表的表。我希望能够执行DNS查找以返回每个IP地址的主机名。例如,给定8.8.8.8,返回'google-public-dns-a.google.com'。我正在尝试编写一个利用xp_cmdshell调用'NSLOOKUP'的函数。这就是我到目前为止所拥有的......

create function dbo.dns_lookup 
(
    @ip varchar(16)
)
returns varchar(200)
as
begin
    declare @cmd nvarchar(200) = 'NSLOOKUP ' + @ip
    declare @tmp table (n varchar(max))

    insert @tmp 
    exec master.dbo.xp_cmdshell @cmd

    return(
        select ltrim(replace(n,'Name:',''))
        from @tmp
        where n like 'Name:%'
    )
end

我理想的用例将是......

select row_id, ip_address, dbo.dns_lookup(ip_address)
from my_table

当然,我在一个函数中得到'无效使用副作用运算符'INSERT EXEC'。错误表明我无法在函数中真正拥有EXEC。我以为我可以将EXEC包装在OPENQUERY中,但是,我无法提供IP地址作为参数。

也许我是从错误的角度来看这个,我相信有更好的方法来达到同样的效果。有什么想法吗?

感谢。

1 个答案:

答案 0 :(得分:0)

实际上,这不是您想要在函数中执行的操作。

解析DNS名称通常需要大约50毫秒到大约4000毫秒,但可能需要更长时间。 对于每个地址。​​因此,无论您如何操作,如果可能的话,您真的希望提前完成,并且您希望保留结果以避免为同一地址多次执行此操作

如果你有一个感兴趣的IP地址的表,我建议创建一个SQLAgent作业,其工作是维护第二个表,其中包含最新的DNS结果。

CREATE TABLE RdnsResults (
    ip varchar(16) primary key,
    datetime lastChecked,
    rdnsName varchar(500)
)

然后,您的SQLAgent作业将检查是否有新行(lastChecked为null)并更新它们。它还可以定期更新旧行。

如果你真的确实需要立即获得结果,那么你的xp_cmdshell应该在命令行上使用IP, 将结果放在表中 。虽然您的函数无法写入表xp_cmdshell命令。然后,您的函数可以从表中读取结果。

我应该补充一点,如果你有大量的IP地址,你需要并行解决它们,出于实际目的,这可能意味着使用Async在C#中编写一些东西。