SQL Server 2016 SP1 - 这是一个错误吗?

时间:2016-11-30 02:23:33

标签: sql-server persistent sql-server-2016

我刚安装了SQL Server 2016和SP1并运行此TSQL脚本

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

返回

Msg 8114,Level 16,State 5,Line 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

2 个答案:

答案 0 :(得分:4)

更改

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
    );

[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]小数连接到varchar字符串的问题。在您实际执行查询之前即使表中没有数据也不会出现问题的原因是由于[lat]字段在执行选择查询之前没有形成。

不一定是bug,而是SQL Management Studio在执行[Location]查询之前应该解析的内容。

答案 1 :(得分:3)

您需要将course COURSEID has section SECTIONID lng和lat值设置为varchar,以便将CAST运算符视为连接而不是添加。没有无关括号的示例:

+