Sql server 从SQL查询设置集合的值
Noob程序员在这里: 我有一个使用SET命令设置变量的函数。我试图循环遍历表中的所有记录并运行该函数,但我不知道如何使其工作。不确定如何让查询拉入其查看的当前记录的列,或者我应该如何进行循环,或者如何设置结果。我试过交叉申请,但没能成功Sql server 从SQL查询设置集合的值,sql-server,Sql Server,Noob程序员在这里: 我有一个使用SET命令设置变量的函数。我试图循环遍历表中的所有记录并运行该函数,但我不知道如何使其工作。不确定如何让查询拉入其查看的当前记录的列,或者我应该如何进行循环,或者如何设置结果。我试过交叉申请,但没能成功 if exists(Select Lat, Long From DDD WHERE Ad1 is not Null) begin DECLARE @address nvarchar (100); set @address = (Select A
if exists(Select Lat, Long From DDD WHERE Ad1 is not Null)
begin
DECLARE @address nvarchar (100);
set @address = (Select Ad1 from DDD where ID = id);
DECLARE @state nvarchar (100);
SET @state = 'FL';
DECLARE @zip nvarchar (100);
SET @zip = (Select AD2 from DDD where ID = id);
DECLARE @city nvarchar (100);
SET @city = 'Miami';
DECLARE @nation nvarchar (2);
SET @nation = 'us';
DECLARE @g geography;
WAITFOR DELAY '00:00:00.050'
SET @g = dbo.Geocode(@nation, @state, @city, @zip, @address);
SELECT @g.Long;
SELECT @g.Lat;
Update DDD Set Lat = @g.Lat
Update DDD Set long = @g.Lat
END
[dbo].[DDD](
[id] [int] IDENTITY(1,1) NOT NULL,
[Day] [nvarchar](50) NULL,
[CaseNum] [nvarchar](50) NULL,
[FolioNum] [nvarchar](50) NULL,
[Ad1] [nvarchar](50) NULL,
[AD2] [nvarchar](50) NULL,
[LD] [nvarchar](250) NULL,
[FJ] [nvarchar](150) NULL,
[AV] [nvarchar](50) NULL,
[PMB] [nvarchar](50) NULL,
[BB] [nvarchar](50) NULL,
[LSSQ] [nvarchar](50) NULL,
[LSQ] [nvarchar](50) NULL,
[status] [bit] NULL,
[Notes] [nvarchar](300) NULL,
[WF] [nvarchar](300) NULL,
[Type] [nvarchar](300) NULL,
[Lat] [float] NULL,
[long] [float] NULL,
试试这个:
Select @address = Ad1 from DDD where ID = id;
增编:
我假设函数Geocode返回一个table,即包含Lat和Long字段的单个记录。您可以使用CTE更新DDD表的每一行,如下所述
DDD中的初始样本数据:
| id | lat | long | Ad |
------------------------
| 1 | NULL| NULL | A |
| 2 | NULL| NULL | B |
| 3 | NULL| NULL | A |
| 4 | NULL| NULL | C |
让Geocode函数从中获取Lat和Long值的基础表包含以下数据:
| Ad | Lat | Long |
-------------------
| A | 12 | 45 |
| B | 13 | 55 |
Let Geocode函数定义如下:
create function Geocode(@add varchar)
returns table
as
return (SELECT * from latlongtable where [add] = @add)
使用以下查询可以更新DDD表中的lat long信息:
with cte_d(id1,Ad)
as
(
select ID as id1, Ad from ddd
)
update d
set d.lat = (select lat from Geo(d.Ad)), long = (select long from Geo(d.Ad))
from ddd d
where d.id = id
运行上述查询后,DDD表如下所示:
| id | lat | long | Ad |
------------------------
| 1 | 12 | 45 | A |
| 2 | 13 | 55 | B |
| 3 | 12 | 45 | A |
| 4 | NULL| NULL | C |
根据您的需要定制上述CTE查询,并告诉我您是否能够使其正常工作。向我们展示DDD的模式。你的更新应该包括一个PK。你当前的例子更新了整个表格。你实际上想用这个函数做什么?这个函数是一个地理编码器。我向它提供了值,它从在线上获取Lat和long。这部分工作,我只是不能让它拉在设置变量,因为我不能设置他们,这是我目前拥有的,我知道它不工作。我得到以下信息。我希望easy子查询返回的值超过1。当子查询在=、!=、=或者当子查询用作表达式时。Msg 512,级别16,状态1,第13行ID是DDD表的主键吗?如果没有,那么这将不起作用。尝试查看id替换为常量时查询返回的内容:从DDD中选择Ad1,其中id=12。它是否返回多条记录?抱歉,我检查了,但复制和粘贴失败。它确实奏效了。你的好朋友。关于我如何让这个循环并执行表中的其他记录,有什么想法吗?很高兴它有帮助,您从哪里获得id参数?试着在问题中提供更多的细节。