2017-12-08 27 views
0

각 우편 번호마다 각 위치 ID에 대해 임의의 지점을 생성하도록 SQL Server를 가져 오려고합니다. 그래서 각 우편 번호에 대한 중심점을 추가했으며이 점들을 중심점 주위에 배포하려고합니다. 각 locationID에 대해 나는 한 점을 원한다. 여기 내 테이블이 현재 모습입니다.SQL Server 중앙 지점에서 우편 번호 내에서 임의의 지점을 개발

테이블 이름 = 위치

LocationName; varchar 
locationID; int 
ZIP: int 
CentroidLat;float 
CentroidLng;float 

샘플 데이터 :

LocationName   LocationID  Zip  CentriodLat CentroidLNG 
------------------------------------------------------------------------- 
    JV     1   99999  38.999999  - 93.999999 
    JV     2   99999  38.999999  - 93.999999 
    AA     1   11111  37.999999  - 94.999999 
    AA     2   11111  37.999999  - 94.999999 
    AA     3   11111  37.999999  - 94.999999 
    BB     1   22222  36.999999  - 95.999999 
    BB     2   22222  36.999999  - 95.999999 

그래서 각 우편의 LocationId 위해 나는 우편 번호 내에서 임의의 위도 오래하고 싶습니다. 나는 이것을 잘 할 수있는 사각형이나 원형으로 얻을 수 있습니다. 너무 정확할 필요는 없습니다. 또한 각 우편 번호는 다른 크기가 될 것이므로 코드가 수동으로 변경 될 수있는 변수가있을 수 있습니다.

이것은 내가 그것을

`LocationName LocationID Zip CentroidLat  Centroid  RandLat RandLNG` 

    JV    1  99999  38.999999 - 93.999999 -93.7436 -94.0124 
    JV    2  99999  38.999999 - 93.999999 -93.9653 -94.0052 
    AA    1  11111  37.999999 - 94.999999 110.9636 -95.7219 
    AA    2  11111  37.999999 - 94.999999 102.6538 -95.7489 
    AA    3  11111  37.999999 - 94.999999 101.9887 -96.0089 
    BB    1  22222  36.999999 - 95.999999 137.5311 -97.9698 
    BB    2  22222  36.999999 - 95.999999 46.7497 -96.9266 

처럼 보이도록이게 가능 싶은 무엇인가?

찾았습니다 ... SQL Server generating random spatial geography around point? 하지만 제대로 작동하지 않습니다.

이 오류가 계속 : 나는 시도하고 코드의 상단에 내 테이블 이름과 열을 삽입 할 때

Msg 116, Level 16, State 1, Line 18
Only one expression can be specified in the select list when the subquery is not introduced with EXISTS.

오류가 발생합니다.

미리 감사드립니다.

답변

0

오류는 공간/지리 대상 객체와 관련이없는 일반적인 SQL 오류입니다. 귀하의 링크에서 참조하는 코드에서 일부 샘플 값을 보유하고 zip 코드 98765에 대해 여러 값이 반환되도록 테이블 변수를 작성했습니다. 코드를 실행하면 설명하는 오류가 발생합니다 :

DECLARE @geo  AS GEOGRAPHY 
     , @newgeo AS GEOGRAPHY 
DECLARE @ZipCodes AS TABLE 
    (
     [ZipGeo] GEOGRAPHY 
     , [ZipCode] SYSNAME 
); 

INSERT INTO @ZipCodes 
      ([ZipGeo] 
      , [ZipCode]) 
VALUES  (geography::STGeomFromText('LINESTRING(-122.360 47.656, -122.343 47.656)', 4326),N'98765'), 
      (geography::STGeomFromText('POLYGON((-122.358 47.653 , -122.348 47.649, -122.348 47.658, -122.358 47.658, -122.358 47.653))', 4326),N'98765'); 

SET @geo = (SELECT [ZipGeo] 
      FROM @ZipCodes 
      WHERE [ZipCode] = '98765') 

주소를 지정하는 방법은 아래 "SELECT TOP (1) .... ORDER BY ..."중 하나이지만 ORDER BY는 실제로 여기에 사용되지 않으며 지형 유형.

DECLARE @geo  AS GEOGRAPHY 
     , @newgeo AS GEOGRAPHY 
DECLARE @ZipCodes AS TABLE 
    (
     [ZipGeo] GEOGRAPHY 
     , [ZipCode] SYSNAME 
); 

INSERT INTO @ZipCodes 
      ([ZipGeo] 
      , [ZipCode]) 
VALUES  (geography::STGeomFromText('LINESTRING(-122.360 47.656, -122.343 47.656)', 4326),N'98765'), 
      (geography::STGeomFromText('POLYGON((-122.358 47.653 , -122.348 47.649, -122.348 47.658, -122.358 47.658, -122.358 47.653))', 4326),N'98765'); 

SET @geo = (SELECT TOP(1) [ZipGeo] 
      FROM @ZipCodes 
      WHERE [ZipCode] = '98765' 
      ORDER BY [ZipCode]) 

이 작업을 수행 할 수 있지만 실제로는 좋지 않습니다.

DECLARE @geo  AS GEOGRAPHY 
     , @newgeo AS GEOGRAPHY 
DECLARE @ZipCodes AS TABLE 
    (
     [ZipGeo] GEOGRAPHY 
     , [ZipCode] SYSNAME 
); 

INSERT INTO @ZipCodes 
      ([ZipGeo] 
      , [ZipCode]) 
VALUES  (geography::STGeomFromText('LINESTRING(-122.360 47.656, -122.343 47.656)', 4326),N'98765'), 
      (geography::STGeomFromText('POLYGON((-122.358 47.653 , -122.348 47.649, -122.348 47.658, -122.358 47.658, -122.358 47.653))', 4326),N'98765'); 

SELECT @geo = [ZipGeo] 
FROM @ZipCodes 
WHERE [ZipCode] = '98765'; 

주문할 수있는 열과 세트의 상단 (1) 만 반환하는 것이 바람직합니다. 그렇게하면 SQL 문이 결정적입니다. SQL은 주문을 보장하지 않으므로 반품을 보장하려면 결과를 주문해야합니다.

표시되는 오류의 원인입니다. 이 문제를 해결할 수있는 몇 가지 방법이 있습니다. 이것은 프로덕션 코드에서 볼 수있는 공통적 인 오류입니다. 사람들이 데이터가 항상 "양호"하다고 가정하고 단 하나의 값만 반환한다고 가정합니다. 그런 다음 데이터가 여러 값을 반환하면 (예 또는 내 예와 같이) 코드가 실패하고 사람들은 이유를 궁금해합니다.

최선의 방법은 코드를 방어 적으로 작성하여 원하는 내용을 정확하게 기재하는 것입니다.