如何使用 SQL 查询将值传递给具有空间/地理数据类型的存储过程

Posted

技术标签:

【中文标题】如何使用 SQL 查询将值传递给具有空间/地理数据类型的存储过程【英文标题】:How to pass value to stored procedure with spatial/geography data type using SQL query 【发布时间】:2018-02-18 21:41:03 【问题描述】:

我是一名学生,经过 2 小时搜索答案后,我希望有人可以在这里帮助我。

我创建了一个需要名称、地址和地理位置的存储过程,然后将一个新分支添加到Branches 表中。我正在尝试使用新查询传递地理值,但我不断收到语法错误。

存储过程:

create procedure AddBranch
    @Name nvarchar(50),
    @Address nvarchar(100),
    @GeographicLocation geography
as
begin
    SET NOCOUNT ON

    insert into Branches (Name, Address, GeographicLocation)
    values (@Name, @Address, @GeographicLocation)

    select BranchID 
    from Branches 
    where BranchID = SCOPE_IDENTITY()
end

查询:

exec AddBranch 
    @Name = 'Some Name',
    @Address = 'Some Address',
    @GeographicLocation = geography::Point(47.65100, -122.34900, 4326)

错误:

'::' 附近的语法不正确

有没有办法将地理数据传递给存储过程?

【问题讨论】:

【参考方案1】:

除了将参数括在引号中之外,您还需要将方法结果分配给局部变量,以便在 T-SQL 中将值作为参数传递:

DECLARE @geographyPoint geography = geography::Point('47.65100', '-122.34900', '4326');
exec AddBranch 
    @Name = 'Some Name',
    @Address = 'Some Address',
    @GeographicLocation = @geographyPoint;

【讨论】:

谢谢,解决了我的问题。现在我需要学习如何将其标记为我选择的答案:)【参考方案2】:

作为旁注:

create procedure dbo.AddBranch --always specify schema
    @Name nvarchar(50),
    @Address nvarchar(100),
    @GeographicLocation geography
as
begin
    SET NOCOUNT ON
    SET XACT_ABORT ON --should be in every data modification SP

    insert into dbo.Branches (Name, Address, GeographicLocation) --schema!
    output inserted.BranchID --this
    values (@Name, @Address, @GeographicLocation)

    select SCOPE_IDENTITY() BranchID  --or this

   --absolutely no need in another read operation from persistent table
end

【讨论】:

【参考方案3】:

像这样将值放在引号中

exec AddBranch 
@Name = 'Some Name',@Address = 'Some Address',
@GeographicLocation = geography::Point('47.65100', '-122.34900', '4326')
go

虽然这可能无法正常工作,具体取决于此自定义 Geography 类型对其值的预期方式,但它会解决语法错误。

【讨论】:

感谢您的回复,但我得到了同样的错误。地理不是我的自定义类型,它已经是 sql 的一部分,我只是在创建表时选择了它。 你尝试使用STPointFromText,像这样:docs.microsoft.com/en-us/sql/t-sql/spatial-geography/…

以上是关于如何使用 SQL 查询将值传递给具有空间/地理数据类型的存储过程的主要内容,如果未能解决你的问题,请参考以下文章

我可以通过查询将值传递给SQL触发器吗?

在Spark SQL作业中使用地理空间函数

将值列表从 Python 传递到 SQL 查询的 IN 子句

SQL Server 2008 地理空间查询

JSTL - 如何将值传递给 SQL 语句

如何计算具有 lat+long 信息的集合的地理空间距离?