0

我有一个未绑定的访问接口,它将表格从表单打包成 XML,并将其发送到 SQL Server 2008 R2 数据库上的存储过程。

正在发送的 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>

通常有几个 (>100) 地图元素。

在我的存储过程中,我有一些代码将 xml 拆箱成一个临时表,然后使用该临时表信息更新数据库中的几个表。

该代码如下所示:

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

这只是捕获进入临时表的任何内容,并允许验证数据到服务器的传输以及 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_GMAPS.

它已经在另一个 SQL Server 2008 R2 实例上工作了几年(我目前正在尝试从我们的 DBA 获取旧版本号。如果我能得到它,我将使用该信息进行更新)。

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

除了参数和事务代码之外,我已经提到了存储过程的大部分内容。完整版在这里:https ://gist.github.com/anonymous/5536290

有谁知道为什么更新不会出现在我的map.TBL_GMAPS桌子上?

4

1 回答 1

1

我想出了这个。几年前,有人(我)在 TBL_GMAPS 上定义了一个触发器,以便在 INSERT 时自动生成 USGS 样式的引文。每当问题中的代码更新表格时,触发器就会触发并重新设置引用。为了解决这个问题,我在这里使用了解决方案——禁用特定 SQL 语句或会话的触发器。

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

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

然后在触发器中,检查 CONTEXT_INFO 以查看它是否已设置

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

这解决了我的问题。

于 2013-05-14T02:12:40.257 回答