Sql server 2008 r2 从临时表更新在SQL Server 2008 R2存储过程中不起作用

Sql server 2008 r2 从临时表更新在SQL Server 2008 R2存储过程中不起作用,sql-server-2008-r2,Sql Server 2008 R2,我有一个未绑定的访问接口,它将表单中的表打包成XML,并将其发送到SQLServer2008R2数据库上的存储过程 要发送的XML如下所示: <maps> <map> <gmapId>1396</gmapId> <citation>Gray, Carlyle; Shepps, V.C.; Conlin, R.R.; Hoskins, D.M.; Shaffner, M.N.; Socolow, A.A.; McLau

我有一个未绑定的访问接口,它将表单中的表打包成XML,并将其发送到SQLServer2008R2数据库上的存储过程

要发送的XML如下所示:

<maps>
  <map>
    <gmapId>1396</gmapId>
    <citation>Gray, Carlyle; Shepps, V.C.; Conlin, R.R.; Hoskins, D.M.; Shaffner, M.N.; Socolow, A.A.; McLaughlin, D.B.; Geyer, A.R.; Cate, A.S.; Lytle, W.S.; Bergsten, J.M.; Miller, J.T.; Wood, G.H., Jr.; Arndt, H.H.; Kehn, T.M., 1960, Geologic map of Pennsylvania (1960), Pennsylvania Geological Survey, Map, 1:250000 scale</citation>
    <use>no</use>
  </map>
</maps>
INSERT INTO dbo.#mapsXref (npsUnitCode, gmapIdF, useForThisPark, citation)
        SELECT @unitCode As npsUnitCode, 
            T.item.value('gmapId[1]','INT') As gmapIdF,
            T.item.value('use[1]','VARCHAR(10)') As useForThisPark ,
            T.item.value('citation[1]', 'VARCHAR(MAX)') As citation
            FROM @mapsList.nodes('maps/map') AS T(item)
我可以通过使用审计表验证XML是否得到了良好的打包,是否包含了正确的信息,以及临时表是否得到了正确的填充:

INSERT INTO dbo.mapsXrefAudit(npsUnitCode, gmapIdF, useForThisPark, citation)
SELECT npsUnitCode, gmapIdF, useForThisPark, citation from dbo.#mapsXref
它只捕获进入temp表的内容,并允许验证数据到服务器的传输以及XML字符串的正确解包

第一次更新工作:

UPDATE map.XREF_GMAP_ID_TRANSLATIONS 
        SET useForThisPark = t.useForThisPark
        FROM map.XREF_GMAP_ID_TRANSLATIONS x INNER JOIN dbo.#mapsXref t 
            ON x.gmapIdF = t.gmapIdF WHERE x.npsUnitCode = t.npsUnitCode
但是,当存储过程使用临时表更新另一个表时:

UPDATE map.TBL_GMAPS
        SET reference = t.citation
        FROM  dbo.#mapsXref t INNER JOIN map.TBL_GMAPS g
            ON g.gmapId = t.gmapIdF
更新不会显示在
map.TBL\u GMAPS

它已经在另一个SQL Server 2008 R2实例上运行了几年(我目前正试图从我们的DBA处获取旧版本。如果可以,我将使用该信息进行更新)

几周前,我们遇到了服务器故障,数据库被迁移到运行build 10.50.4000的新服务器上。我最终不得不重新设置一堆对象级权限,因为前面提到的access应用程序的各个部分都会抛出有关权限的错误,但我现在似乎没有遇到任何这些问题。我将整个位包装到一个事务中,该事务将回滚,并在出现错误时生成错误消息。但是我在提交时没有错误

除了参数和事务代码之外,我还提到了存储过程的大部分内容。全文如下:


有人知道为什么更新不会出现在我的
map.TBL\u GMAPS
表上吗?

我找到了这个。几年前,有人(我)在TBL_GMAP上定义了一个触发器,在插入时自动生成美国地质调查局风格的引用。每当问题中的代码更新表时,触发器就会触发并重新设置引用。为了解决这个问题,我使用了这里的解决方案--

我将上面的更新部分更改为:

SET CONTEXT_INFO 0x555555
UPDATE map.TBL_GMAPS
        SET reference = t.citation
        FROM  dbo.#mapsXref t INNER JOIN map.TBL_GMAPS g
            ON g.gmapId = t.gmapIdF
然后在触发器中,检查上下文信息以查看是否已设置

DECLARE @Cinfo VARBINARY(128)
SELECT @Cinfo = CONTEXT_INFO()
If @Cinfo = 0x555555
  RETURN

UPDATE map.TBL_GMAPS SET
reference=dbo.createUsgsCitation(m.gmapId)
FROM inserted i INNER JOIN  map.TBL_GMAPS m
ON m.gmapId = i.gmapId
这解决了我的问题