sql-server-2008 - SQL查询中的SQL Server 参数表值

  显示原文与译文双语对照的内容
0 0

我做了一个函数,使用 varchar ( IP地址) 并返回表值( 城市,国家,time_zone ) 。"。"。

ALTER function [dbo].[GQuery2](@ipAddress varchar(16)) 
 returns @t table (
 [country_name] [nvarchar](64), 
 [region_name] [nvarchar](128), 
 [city_name] [nvarchar](128),
 [latitude] [float],
 [longitude] [float], 
 [zip_code] [nvarchar](30), 
 [time_zone] [nvarchar](8) 
 )
 as 
 begin 
 insert into @t ([country_name]
, [region_name]
, [city_name]
, [latitude]
, [longitude]
, [zip_code]
, [time_zone])
 select [country_name]
, [region_name]
, [city_name]
, [latitude]
, [longitude]
, [zip_code]
, [time_zone]
 from [pcap].[dbo].ip2loc 
 where ip_from = ( 
 select max(ip_from) 
 from [pcap].[dbo].ip2loc 
 where ip_from <= [dbo].IP2INT(@ipAddress) 
 ) 
 and ip_to = ( 
 select min(ip_to) 
 from [pcap].[dbo].ip2loc 
 where ip_to> = [dbo].IP2INT(@ipAddress) 
 ) 
 RETURN 
 end

问题是,我只能以这种格式调用函数:

 SELECT * FROM [dbo].GQuery2('89.98.0.0') 

并返回一个新表格

country_name region_name city_name latitude longitude zip_code time_zone
NETHERLANDS NOORD-HOLLAND AMSTERDAM 52.37403 4.88969 1089 +02:00

我想做一个这样的查询( 理论上)

UPDATE DimLocation d, [dbo].GQuery2(d.ip) g 
SET d.city_name = g.city_name, d.country_name = g.country_name.. ..

DimLocation 表具有架构:

IP, country_name, region_name, city_name, latitude, longitude, zip_code, time_zone

IP地址有一个值,其他列是空的,我需要将 DimLocation 地址从传递到函数 GQuery2(ip) 以获取丢失的数据。

这个问题是如何在 select 语句中处理表值函数?

时间:原作者:2个回答

0 0

尝试以下查询:

Update DimLocation
Set City_Name = g.City_Name,
 Country_Name = g.Country_Name,
. . ..
From dbo.GQuery2(DimLocation.IP) g
原作者:
0 0

函数还应包含 IP 字段,以便与 DimLocation 表联接函数,否则查询将更新 DimLocation 表中的所有记录( IE ) 。 Where DimLocation.IP='192.168.0.1' ) 最好做的是,检索记录应该有一个可以以与你要更新的父表匹配的字段。

如果在函数中添加了 IP 字段,那么查询应该像这样写。

Update DimLocation Set DimLocation.City_Name = f.City_Name, DimLocation.Country_Name=f.Country_Name,.. 
From DimLocation Inner Join dbo.GQuery2(DimLocation.IP) f On DimLocation.IP=f.IP

因此,你可以在单个查询中使用创建的函数更新 DimLocation 表中的所有值。

原作者:
...