通过遍历行更新列
Update column by looping through rows
我在 table ID
、Longitude
、Latitude
和 SpatialData
中有四列。我为每一行填写了前三列,但我需要为每一行输入 SpatialData
。我目前可以使用以下查询手动更新 SpatialData
列:
update GioMap set SpatialData = 'Point(-74.009506 40.70602)' Where ID =1
从这里开始,我必须继续手动更新每一行的 Longitude
、Latitude
和 ID
。我正在使用此代码尝试遍历所有行并以这种方式更新 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 开发人员只使用单引号。
本
我在 table ID
、Longitude
、Latitude
和 SpatialData
中有四列。我为每一行填写了前三列,但我需要为每一行输入 SpatialData
。我目前可以使用以下查询手动更新 SpatialData
列:
update GioMap set SpatialData = 'Point(-74.009506 40.70602)' Where ID =1
从这里开始,我必须继续手动更新每一行的 Longitude
、Latitude
和 ID
。我正在使用此代码尝试遍历所有行并以这种方式更新 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 开发人员只使用单引号。
本