2017-07-18 53 views
2

我有一個列表中包含一列IP地址。我希望能夠執行DNS查找以返回每個IP地址的主機名。例如,給出8.8.8.8,返回'google-public-dns-a.google.com'。我正在嘗試編寫一個利用xp_cmdshell調用「NSLOOKUP」的函數。這是我迄今爲止..在SQL Server中的DNS查找

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

我在過去使用xp_cmdshell做了這樣的事情,但我真的建議使用SQL/CLR。 – Ben

回答

0

真的,這不是你想做的功能。

解析DNS名稱通常需要大約50ms到4000ms,但可能需要更長的時間。 每個地址。所以不管你怎麼做,你都希望儘可能提前做,而且你想保持結果,避免在相同的地址上多次使用它。

如果您有一張包含感興趣IP地址的表,我會建議創建一個SQLAgent作業,其作業是維護具有最新DNS結果的第二個表。

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

然後,您的SQLAgent作業將檢查是否有任何新行(lastChecked爲空)並更新它們。它也可以定期更新舊行。

如果你真的真的需要立即得到結果,你的xp_cmdshell的應採取的IP在命令行上和結果放在桌子。雖然您的功能無法寫入表格,但xp_cmdshell命令可以。然後你的函數可以從表格中讀出結果。

我應該補充說,如果您有任何大量的IP地址,您需要並行解析它們,這對於實際目的來說可能意味着使用C#使用Async編寫某些內容。

+0

感謝您的輸入。我應該在我原來的帖子中提到,這是純粹靜態的數據,不會添加新的行,這是一種一次性的數據倉庫安排。話雖如此,我將開始研究C#CLR並利用並行化。 – nolegjoe

+0

如果它是純粹的靜態數據而沒有添加新行,那麼**當然**您希望使用外部程序(由SQLAgent作業運行)來維護數據。您的功能只是從現有數據中「選擇」。如果表格索引正確,這樣的功能可以非常快。另外,你可以以正常的方式使用該表,例如加入等等 – Ben