如何在 SSDT 中架构绑定使用地理或 Json 的函数?

How do I schema bind a function that uses geography or Json in SSDT?

我有一个 table 有价值的函数,我想添加到我的 ssdt 项目中。

create function dbo.fn_get_n_geos(@p0 nvarchar(max),@n bigint)
returns table
with schemabinding as
return 
select top(@n) geo=geography::Point(latitude,longitude,4326)
              ,row=-1 + convert(int,row_number() over (order by (select 1)))
from openjson(@p0)
with (latitude float 'strict $[0]', longitude float 'strict $[1]');

当我添加这个函数时,我收到以下警告::

SQL70561: Cannot schema bind function 'dbo.fn_get_n_geos' because name 'geography' is invalid for schema binding. Names must be in two-part format and an object cannot reference itself.

SQL70561: Cannot schema bind function 'dbo.fn_get_n_geos' because name 'float' is invalid for schema binding. Names must be in two-part format and an object cannot reference itself.

当我在 SQL management studio 中执行此功能时,一切正常。我如何让 SSDT 玩这些功能?

我的项目针对 SQL Server 2016。

TL;DR:尝试使用 sys.

限定名称

在你的情况下,尝试将 geography 更改为 sys.geography;您可能还必须对 OPENJSON 调用中的 float 列执行相同的操作。


刚遇到完全相同的问题,但 OPENJSON 具有显式 nvarchar 列映射,例如:

OPENJSON(@query) 
WITH
(
  axis nvarchar(64) '$.axis',
  value nvarchar(max) '$.value' AS JSON
)

我在 axisvalue 行收到错误。

这似乎是 SSDT 中的错误 - John.Nelson 在开发者社区门户 here 上报告。

我已经准备好建议丑陋的回落到 post-deploy,然后我偶然发现了 this over on Dba Stackexchange(我搜索了错误代码 SQL70561),其中OP 在使用 hierarchyid.

的视图中出现相同的错误

那里的解决方案是将 hierarchyid 限定为 sys.hierarchyid

从来没有 打扰限定内置 SQL 类型名称 - 但是,果然,一旦我改变了我的OPENJSON 调用:

OPENJSON(@query) 
WITH
(
  axis sys.nvarchar(64) '$.axis',
  value sys.nvarchar(max) '$.value' AS JSON
)

那个对我有用。