通过循环遍历行来更新列

时间:2017-03-07 19:37:05

标签: sql sql-server geospatial

我在表IDLongitudeLatitudeSpatialData中有四列。我为每一行填写了前三列,但我需要为每行输入SpatialData。我目前可以使用以下查询手动更新SpatialData列:

update GioMap set SpatialData = 'Point(-74.009506 40.70602)' Where ID =1

从这里开始,我必须手动更新每一行的LongitudeLatitudeID。我正在使用此代码尝试遍历所有行并以这种方式更新表:

DECLARE @LoopC INT = 1, @MaxOID INT, 
         @Long nVarchar(32), @Lat nVarchar(32),@Col1 nVarchar(11)
 SET @MaxOID = (select count(*) from GioMap)
 Set @Col1 = 'SpatialData'

WHILE(@LoopC <= @MaxOID)
BEGIN

   SET @Long = (Select Longitude FROM GioMap where ID = @LoopC)
   SET @Lat = (Select Latitude FROM GioMap where ID = @LoopC)

   DECLARE @sql VARCHAR(MAX) = ('update GioMap set ' + @Col1 +' = ' + '''' + 'Point(' + @Long + ' ' + @Lat + ')' + '''' + ' Where ID = ' + @LoopC) 

 EXEC sp_executesql @sql

  SET @LoopC  = @LoopC + 1        
END

当我运行此代码时,我不断收到此错误消息:

Msg 245, Level 16, State 1, Line 13
Conversion failed when converting the nvarchar value 'update [ISSHXI1].[dbo].[GioMap] set SpatialDat = 'Point(-74.0095 40.706)' Where ID = ' to data type int.

我不明白为什么会尝试将其转换为int?

3 个答案:

答案 0 :(得分:4)

你可以这样做:

UPDATE GioMap SET SpatialData = 'Point(' + cast(Longitude as varchar) + ' ' + cast(Latitude as varchar) + ')' 

答案 1 :(得分:1)

我认为你这样做的方式很糟糕,但从技术上来说,这并不是你所要求的。

它正在尝试将其转换为int,因为您正在向int添加varchar。你需要改变这个:

  

DECLARE @sql VARCHAR(MAX)=(&#39;更新GioMap集&#39; + @ Col1 +&#39; =&#39; +   &#39;&#39;&#39;&#39; +&#39;点(&#39; + @Long +&#39;&#39; + @Lat +&#39;)&#39; +&#39;&#39;&#39;&#39; +&#39; ID =&#39; +   @LoopC)

到这个

  

DECLARE @sql VARCHAR(MAX)=(&#39;更新GioMap集&#39; + @ Col1 +&#39; =&#39; +   &#39;&#39;&#39;&#39; +&#39;点(&#39; + @Long +&#39;&#39; + @Lat +&#39;)&#39; +&#39;&#39;&#39;&#39; +&#39; ID =&#39; +   演员(@LoopC as varchar))

答案 2 :(得分:0)

点声明参数需要用逗号分隔。 DECLARE @sql VARCHAR(MAX)=('更新GioMap设置'+ @ Col1 +'='+''''+'点('+ @Long +''+ @Lat +')'+'''+ 'ID ='+ @LoopC)

而不是:

@Long + ' ' + @Lat + ')
     try 
@Long + ',' + @Lat + ')

要查看正在执行的内容,您可以尝试添加打印语句:

 DECLARE @sql VARCHAR(MAX) = ('update GioMap set ' + @Col1 +' = ' + '''' + 'Point(' + @Long + ' ' + @Lat + ')' + '''' + ' Where ID = ' + @LoopC) 
 print @sql
 EXEC sp_executesql @sql

另外,为什么你会围绕你指定的字符串进行调整?它在TSQL中令人困惑。虽然它的工作原理很刺耳,也很不寻常。 而不是:

SET @MaxOID =  (select count(*) from GioMap)
   try
SET @MaxOID =  'select count(*) from GioMap'

稍后在代码中,您同时执行parens和引号。伟大的绝大多数TSQL开发人员只使用单引号。