2014-07-07 2 views
0

가 나는 varchar (IP 주소)를 받아 테이블 값을 반환하는 함수 (도시, 국가, TIME_ZONE을 ...)SQL Server 매개 변수 테이블 값은

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 

그리고 나는 DimLocation 테이블이 스키마가

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

(이론적으로)이 같은 쿼리를 만들고 싶어 :

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

IP 주소에 값이 다른 열이 NULL입니다을하고 난을 전달해야 IP 주소가 DimLocation에서 GQuery2(ip)으로 누락 된 데이터를 얻으려면

질문은 select 문에서 테이블 반환 함수를 사용하는 방법입니까?

답변

0

시도 다음 쿼리 :

Update DimLocation 
Set City_Name = g.City_Name, 
    Country_Name = g.Country_Name, 
    .... 
From dbo.GQuery2(DimLocation.IP) g 
+0

아무것도 업데이트 pcap.dbo.DimLocation 설정 CITY_NAME = g.city_name는 바인딩 할 수 없습니다. – teter

0

함수는 달리 쿼리가 DimLocation 테이블의 모든 레코드를 업데이트합니다 DimLocation 테이블과 기능에 가입 IP 필드를 포함해야한다 또는 당신은 한 번에 하나의 레코드를 업데이트해야 (예 : 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 테이블의 모든 값을 업데이트 할 수 있습니다. "d.ip"dbo.GQuery2 (d.ip) g :( 다중 부분 식별자에서

관련 문제