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