2016-11-30 34 views
3

我剛剛安裝了SQL Server 2016和SP1並運行此腳本TSQLSQL Server 2016 SP1 - 這是一個錯誤嗎?

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 
) 

創建表的罰款。

我然後運行以下(有在表中沒有記錄)

Select * from TEST 

這返回

消息8114,級別16,狀態5,第8行 誤差變換數據類型爲varchar到數字。

它與Location字段有關。

這是SQL Server 2016中的錯誤嗎?我不希望這種行爲。

下不會引起任何問題

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

它在SQL-Server 2014上也失敗了 –

+0

你不能這樣做,那麼你爲什麼希望將它作爲一個計算列? 'SELECT [geography] :: STGeomFromText(((('POINT('+12)+'')+93)+')',(4326))' - 好像你需要用觸發器填充值與動態SQL。 –

回答

3

您需要CAST液化天然氣和LAT值,爲varchar所以+操作被視爲串聯,而不是加法。例如但外來括號:

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

變化

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

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

在這兩個的差別是CAST功能的使用像這樣:

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

只需將[lng][lat]的小數連接到varchar字符串即可。在實際執行查詢(即使表中沒有數據)之前,它不會成爲問題的原因在於[Location]字段在執行選擇查詢之前不會形成。

不是一個必然的錯誤,而是SQL Management Studio在執行CREATE TABLE查詢之前應該解析的東西。