SQL Server 형상 BLOB에서 다른 것으로 변환하는 방법?


14

내 보낸 SQL Server 테이블 인 타사의 CSV 데이터 파일이 있습니다. 그들은 단순히 a를 select * from foo하고 결과를 텍스트 파일로 출력하여 보냈습니다.

그들의 테이블에는 기하학 유형의 열이 있으므로, 나는 원시 텍스트에 "0xE610000010C47 ..."등과 같은 것을 가지고 있습니다. 현재 SQL Server의 테이블에 nvarchar로로드했습니다.

필자는 최종적으로 Geometry 필드로 되돌릴 수있을 것으로 예상했지만 쉽지 않은 것 같습니다. STGeomFromWKB실제로 WKB가 아니기 때문에 작동하지 않습니다. 문자열이 WKT가 아니라고 불평하기 때문에 Geometry로 캐스트 할 수 없습니다.

그렇다면이 값을 일반적인 Geometry BLOB 인 것처럼 SQL Server에 가져올 수있는 방법이 있습니까? SQL Server에이를 처리하도록 지시 할 수 있습니까?

SQL Server에 무엇이 있는지에 대한 질문에 적어도 대답하는 데 도움이되는이 링크를 찾았지만 SQL Server 2008의 기하학 데이터 형식의 형식은 무엇입니까?


WKB (Well Known Binary)처럼 Esri 설명 edndoc.esri.com/arcsde/9.1/general_topics/가 있지만 형식은 OGC (Open Geospatial Consortium)입니다. 제공된 링크 또는 나열된 msdn.microsoft.com/en-AU/library/bb933960.aspx 에 설명 된 기능 문제 16 진수 문자열을 실제로 이진이 아닌 텍스트로 가져온다 는 데 문제가 있다고 생각합니다. 나는 SQL의 백엔드와별로 관련이 없었습니다. 아마도 stackexchange에서 Super User 또는 DB Admin에게 요청할 수 있습니다.
Michael Stimson

@Peter 문제에 대한 해결책을 찾은 적이 있습니까?
DPSSpatial

답변:


9

데이터를 SQL Server로 가져올 때 VARBINARY (MAX) 열에 넣으십시오. 그런 다음 필요에 따라이를 형상 또는 지리로 작성할 수 있습니다. 가져 오는 동안 문자열 0xE6 ...이 변경되지 않도록주의해야합니다.

다른 옵션은 동적 쿼리를 수행하여 선택을 얻는 것입니다. 아래에 몇 가지 변환 예제를 넣었습니다.

-- As a varchar and binary
DECLARE @NV AS NVARCHAR(MAX) = '0xE610000001040E0000002AA57BA76F5446C027B8FD971024654007517714795446C00C42473D1624654094CFCDE3795446C0D3F576B91624654068507E9C7A5446C0D7BE805E18246540F2FC444A7C5446C0E93DDF6019246540B4CA4C697D5446C0D5DF5C0D1A2465401A0923AC7C5446C08183DE3F1A2465407599E1907B5446C0E2A8818B1A24654058B4805A7A5446C0A70261DE1A24654089729F5C775446C072080BDD1B2465401AAC24A8745446C057CB10FE1C2465403D16A5446E5446C05A20FEE21A246540658BA4DD685446C00907FFA3172465402AA57BA76F5446C027B8FD971024654001000000020000000001000000FFFFFFFF0000000003' 
DECLARE @NB AS VARBINARY(MAX) = 0xE610000001040E0000002AA57BA76F5446C027B8FD971024654007517714795446C00C42473D1624654094CFCDE3795446C0D3F576B91624654068507E9C7A5446C0D7BE805E18246540F2FC444A7C5446C0E93DDF6019246540B4CA4C697D5446C0D5DF5C0D1A2465401A0923AC7C5446C08183DE3F1A2465407599E1907B5446C0E2A8818B1A24654058B4805A7A5446C0A70261DE1A24654089729F5C775446C072080BDD1B2465401AAC24A8745446C057CB10FE1C2465403D16A5446E5446C05A20FEE21A246540658BA4DD685446C00907FFA3172465402AA57BA76F5446C027B8FD971024654001000000020000000001000000FFFFFFFF0000000003

-- Failing conversions
SELECT CAST(@NV AS Geometry)
SELECT CAST(CAST(@NV AS VARBINARY(MAX)) AS Geometry)
-- Correct conversion
SELECT CAST(@NB AS Geometry)
EXEC('SELECT CAST(' + @NV + ' AS Geometry)')

6

@MickyT의 답변을 바탕으로 WKB (또는 우리가 부르는 것)에 이미 값이있는 테이블이 있기 때문에 모든 레코드를 지오메트리로 변환하지 않고 sql을 작성하려고합니다. 변수 선언 등

따라서 하나의 레코드에서 WKB를 복제하는 간단한 임시 테이블로 시작하면 다음과 같습니다.

select 0x3D0B0000010C80BAE380AE064841005149CD6EFD3941 as wkb

이제 임시 테이블로 처리하고 SQL을 감싸면 WKB가있는 열이 있고 위에서 제안한대로 varbinary로 변환 할 수 있습니다.

select 
cast(temp.wkb as varbinary(max)) as geombinary
from 
(
select 0x3D0B0000010C80BAE380AE064841005149CD6EFD3941 as wkb
) as temp

여기서 temp.wkb 는 CSV의 WKB 값을 포함하는 큰 테이블의 열일 수 있습니다.

마지막으로 MickyT에서 설명한 방법을 사용하여 varbinary를 geometry로 변환하십시오.

select 
cast(geomconvert.geombinary as geometry) as geom
 from (
select 
cast(temp.wkb as varbinary(max)) as geombinary
from 
(
select 0x3D0B0000010C80BAE380AE064841005149CD6EFD3941 as wkb
) as temp
) as geomconvert

지오메트리와 공간 결과를 반환합니다.

여기에 이미지 설명을 입력하십시오

편집 SRID는 어디에 선언됩니까? MickyT가 대답 한 것처럼 바이너리에 있으며 테스트를 위해 SQL 쿼리를 1 개 더 랩핑 할 수 있습니다.

select top 1 getsrid.geom.STSrid from (

select 
cast(geomconvert.geombinary as geometry) as geom
 from (
select 
cast(temp.wkb as varbinary(max)) as geombinary
from 
(
select 0x3D0B0000010C80BAE380AE064841005149CD6EFD3941 as wkb
) as temp
) as geomconvert

) as getsrid

내 예제에서 2877 (콜로라도 상태 비행기)을 산출하고 정확합니다.

여기에 이미지 설명을 입력하십시오


1
SRID는 Geometry 바이너리에 내장되어 있습니다. 제공되는 이진은 WKB가 아니라 Geometry의 실제 SQL Server 이진 표현입니다.
MickyT

@MickyT 아 그래! 테스트 할 스 니펫을 하나 더 게시하겠습니다 ... 감사합니다 !!!
DPSSpatial

원래 테이블에 형상 열을 추가하고 해당 열을 형상으로 업데이트 할 수 있습니까?
피터 Horsbøll Møller

1
@ PeterHorsbøllMøller 변환이 끝나면 올바른 동작이라고 생각합니다. 나는 그 일을하고 나중에 게시 할 것입니다.
DPSSpatial

3

원래 포스터는 가입을 마치려고 할 때 원래 게시물의 로그인을 연결하지 않았습니다. 어쨌든....

모든 도움을 주셔서 감사합니다! 가능한 경우 각 답변을 상향 조정하고이 계정과 원래 계정을 연결하는 방법을 알아낼 수있는 경우 답변을 표시 할 수 있습니다. 또한, 당신의 포인터 후에 나는 CONVERT대신 사용 을 놓친 것을 믿을 수 없습니다 CAST. 훨씬 쉬워집니다.

내 주된 문제는 원시 바이너리 "문자열"을 내가 사용할 수있는 것으로 얻는 것입니다. 다음은 내가 어떻게 해결했는지에 대한 샘플입니다.

DECLARE @data TABLE (
  ID nvarchar(1024),
  ImportedGeometry nvarchar(max),
  FinalGeometry geometry
  )

  INSERT INTO @data (ID, ImportedGeometry) values ('1', '0xE6100000010C4703780B24B855C061C3D32B65093540')
  INSERT INTO @data (ID, ImportedGeometry) values ('2', '0xE6100000010C96438B6CE7D359C0BD5296218E853440')

select 
d.ID,
d.ImportedGeometry,
CONVERT(varbinary(max), d.ImportedGeometry, 1) as ConvertedGeometryBin,
(cast(CONVERT(varbinary(max), d.ImportedGeometry, 1) as geometry)) as FinalGeometry
from @data d

UPDATE @data
SET FinalGeometry = (cast(CONVERT(varbinary(max), ImportedGeometry, 1) as geometry))

select 
d.ID,
d.FinalGeometry,
d.FinalGeometry.STAsText(),
d.FinalGeometry.STSrid
from @data d

좋아 보인다 !!! 이 모든 것을 문서화하는 것이 좋습니다 ... 언젠가는 편리 할 것입니다!
DPSSpatial

BI 부서의 한 동료가이 게시물을 독립적으로 찾아서 SQL Server Integration Services (SSIS)가 서버간에 지오메트리를주고 받도록하는 데 사용했습니다.이 시점에서는 기본적으로 SSIS에서 찾을 수 없습니다 !! !
DPSSpatial
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.