通过遍历行更新列

Update column by looping through rows

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

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

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

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?

你可以这样做:

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

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

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

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

至此

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

点语句参数需要用逗号分隔。 声明 @sql VARCHAR(MAX) = ('update GioMap set ' + @Col1 +' = ' + '''' + 'Point(' + @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'

稍后在代码中同时使用括号和引号。绝大多数 TSQL 开发人员只使用单引号。