2016-11-30 1 views
3

ich nur SQL Server installiert 2016 und SP1 und führen Sie dieses T-SQL-SkriptSQL Server 2016 SP1 - Ist das ein Fehler?

CREATE TABLE [dbo].TEST(
[id] [INT] IDENTITY(1,1) NOT NULL, 
[lat] [DECIMAL](9, 6) NULL, 
[lng] [DECIMAL](9, 6) NULL, 
[Location] AS ([geography]::STGeomFromText(((('POINT ('+[lng])+' ')+[lat])+')',(4326))) 
    PERSISTED 
) 

Der Tisch ist in Ordnung geschaffen.

ich dann laufen die folgenden (es gibt keine Datensätze in der Tabelle ist)

Select * from TEST 

Das gibt

Msg 8114, Ebene 16, Status 5, Zeile 8 Fehler beim Konvertieren Datentyp varchar numerisch.

Es ist mit dem Feld Location verwandt.

Ist dies ein Fehler in SQL Server 2016? Ich würde dieses Verhalten nicht erwarten.

Die folgende etwaige Probleme nicht

CREATE TABLE [dbo].TEST2(
[id] [INT] IDENTITY(1,1) NOT NULL, 
[lat] [DECIMAL](9, 6) NULL, 
[lng] [DECIMAL](9, 6) NULL, 
[Location] AS [lng] PERSISTED 
) 

select * from TEST2 
+0

Es schlägt auch das gleiche auf SQL-Server 2014 –

+0

Sie können dies nicht tun, also warum sollten Sie dies als eine berechnete Spalte tun? 'SELECT [geography] :: STGeomFromText ((('POINT (' +12) + '') +93) + ')', (4326))' - scheint, als müssten Sie die Werte mit einem Trigger auffüllen mit dynamischem SQL. –

Antwort

3

Sie benötigen verursacht die lng und lat Werte CAST so die + Operator in varchar als Verkettung statt zusätzlich behandelt wird. Beispiel ohne Fremd Klammer:

CREATE TABLE [dbo].TEST(
    [id] [INT] IDENTITY(1,1) NOT NULL, 
    [lat] [DECIMAL](9, 6) NULL, 
    [lng] [DECIMAL](9, 6) NULL, 
    [Location] AS [geography]::STGeomFromText('POINT ('+ CAST([lng] AS varchar(10)) + ' ' + CAST([lat] AS varchar(10)) + ')', 4326) 
     PERSISTED 
    ); 
4

ändern

[Location] AS ([geography]::STGeomFromText(((('POINT (' + [lng]) + ' ') + [lat]) + ')', (4326))) 

zu

[Location] AS ([geography]::STGeomFromText(((('POINT (' + CAST([lng] AS varchar)) + ' ') + CAST([lat] AS varchar)) + ')', (4326))) 

Der Unterschied in diesen beiden sind die Nutzung der CAST Funktion wie so:

CAST([lng] AS varchar) 
CAST([lat] AS varchar) 

Einfach eine Ausgabe von [lng] und [lat] Dezimalstellen verkettet zu einer Varchar-Zeichenfolge. Der Grund dafür, dass es kein Problem ist, bis Sie die Abfrage tatsächlich ausführen, obwohl keine Daten in der Tabelle vorhanden sind, liegt daran, dass das Feld [Location] erst gebildet wird, wenn die Auswahlabfrage ausgeführt wird.

Nicht unbedingt ein Fehler, aber etwas, das SQL Management Studio vor der Ausführung der CREATE TABLE-Abfrage wahrscheinlich analysieren sollte.