2017-06-22 4 views
0

Ich versuche, eine gespeicherte Prozedur in MSSMS zu erstellen, die, wenn sie ausgeführt wird, die in der Anweisung execute angegebenen Daten in zuvor erstellte Tabellen einfügen.STPointFromText ohne Angabe von Koordinaten im Code

Dies ist, was ich derzeit habe;

Create Procedure UDP_INSERT_TABLES3 
      @shape_type varchar(30) 
     ,@wktdata varchar(max) 
     ,@label varchar(40) 

    AS 
    Begin 


     set nocount on; 

     if @shape_type = 'Point' 
     insert into Points (Point, Label) 
     values (@wktdata, @label) 
END 

Wenn ich jedoch versuche, dies mit einer Anweisung wie auszuführen;

exec UDP_INSERT_TABLES3 'Point', '(179.59 -40.35)', 'My House' 

Ich bekomme "Fehler beim Konvertieren von Datentyp Varchar in Geographie."

Von was ich verstehe, "STPointFromText" wird verwendet, um Varchar zu Geografie zu konvertieren, aber jedes Beispiel, das ich sehe, hat die Koordinaten sozusagen "hart codiert".

Zum Beispiel;

DECLARE @g geography; 
SET @g = geography::STGeomFromText('POINT(-122.34900 47.65100)', 4326); 
SELECT @g.ToString(); 

Was muss ich tun, um die in meiner Anweisung execute angegebenen Koordinaten zu konvertieren? Ich habe über die Verwendung von CAST nachgedacht, aber ich bin mir nicht sicher, wie ich sowohl die Breite als auch die Länge in einer Klammer umwandeln kann, anstatt sie einzeln zu übertragen.

Jede Hilfe würde sehr geschätzt werden.

Antwort

0

Sie waren fast da, Sie müssen daran denken, dass Sie die Eingabe in ein Geografiefeld konvertieren müssen. Versuchen Sie folgendes:

CREATE Procedure UDP_INSERT_TABLES3 
      @shape_type varchar(30) 
     ,@wktdata varchar(max) 
     ,@label varchar(40) 

AS 
BEGIN 
    set nocount on; 
    if @shape_type = 'Point' 
    BEGIN 
    insert into Points (Point, Label) 
    values (geography::STGeomFromText('POINT' + @wktdata, 4326), @label) 
    END 
END 

Dann werden diese Aussagen:

exec UDP_INSERT_TABLES3 'Point', '(179.59 -40.35)', 'My House' 

SELECT Point, Label, Point.ToString() as PointString FROM POINTS 

Give:

Point           Label  PointString 
0xE6100000010CCDCCCCCCCC2C44C07B14AE47E1726640 My House POINT (179.59 -40.35) 
+0

Danke Mann, alles funktioniert jetzt perfekt –

0

Wenn Sie nicht verheiratet sind, um mit etwas, das wie WKT aussieht, ist aber nicht, könnte ich schlagen Sie die statische Methode Point() vor? Es benötigt drei Argumente (Breitengrad, Längengrad und SRID) und gibt ein Geografie- oder Geometriepunktobjekt zurück. Wie so:

declare @lat float = 50, @long float = 50; 
select geography::Point(@lat, @long, 4326); 
Verwandte Themen