如何使用 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 查询将值传递给具有空间/地理数据类型的存储过程的主要内容,如果未能解决你的问题,请参考以下文章