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 地址作为参数。

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

谢谢。

实际上,这不是你想在函数中做的事情。

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

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

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

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

如果您确实需要立即获取结果,您的xp_cmdshell应该在命令行上获取 IP 并将结果放在表中。尽管函数无法写入表,但xp_cmdshell命令可以。然后,您的函数可以从表中读取结果。

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

最新更新