我在一列中有一个包含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地址作为参数。
也许我是从错误的角度来看这个,我相信有更好的方法来达到同样的效果。有什么想法吗?
感谢。
答案 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#中编写一些东西。