Sql server 从SQL查询设置集合的值

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

Noob程序员在这里:

我有一个使用SET命令设置变量的函数。我试图循环遍历表中的所有记录并运行该函数,但我不知道如何使其工作。不确定如何让查询拉入其查看的当前记录的列,或者我应该如何进行循环,或者如何设置结果。我试过交叉申请,但没能成功

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参数?试着在问题中提供更多的细节。