0

我有一个表,它存储需要插入另一个数据库的记录。插入这些值后,我需要将这些记录标记为已处理,以防止它们被重新处理。

DECLARE @InsertedValues TABLE (
    [ITEMNMBR] nchar(31),
    [ITEMDESC] nchar(101),
    [ITMSHNAM] nchar(15),
    [ITMGEDSC] nchar(11),
    [UOMSCHDL] nchar(11),
    [ALTITEM1] nchar(31),
    [ALTITEM2] nchar(31),
    [USCATVLS_1] nchar(11),
    [USCATVLS_2] nchar(11),
    [USCATVLS_3] nchar(11),
    [USCATVLS_6] nchar(11),
    [ABCCODE] int,
    [ROW_ID] int
)

-- INSERT NEW INVENTORY ITEMS INTO DB
INSERT INTO TABLE1..IV00101 (ITEMNMBR,ITEMDESC,ITMSHNAM,ITMGEDSC,UOMSCHDL,ALTITEM1,ALTITEM2,USCATVLS_1,USCATVLS_2,USCATVLS_3,USCATVLS_6,ABCCODE)
OUTPUT          
    INSERTED.[ITEMNMBR],
    INSERTED.[ITEMDESC],
    INSERTED.[ITMSHNAM],
    INSERTED.[ITMGEDSC],
    INSERTED.[UOMSCHDL],
    INSERTED.[ALTITEM1],
    INSERTED.[ALTITEM2],
    INSERTED.[USCATVLS_1],
    INSERTED.[USCATVLS_2],
    INSERTED.[USCATVLS_3],
    INSERTED.[USCATVLS_6],
    INSERTED.[ABCCODE],
    U.[ROW_ID] INTO @InsertedValues
SELECT U.[ITEMNMBR],U.[ITEMDESC],U.[ITMSHNAM],U.[ITMGEDSC],U.[UOMSCHDL],U.[ALTITEM1],U.[ALTITEM2],U.[USCATVLS_1],U.[USCATVLS_2],U.[USCATVLS_3],U.[USCATVLS_6],U.[ABCCODE]
FROM 
    DYNAMICS..TABLE2 AS U
WHERE 
    U.[ProcessedFlag] = 0 AND 
    U.[Action] = 'I' AND 
    U.[DestinationCompany] = 'COMPANY1' AND
    U.[DestinationTable] = 'IV00101'

就目前而言,此查询不起作用,因为它抱怨 OUTPUT 语句中的 U.[ROW_ID] 列是有道理的。所以我的问题是,如何获取插入的行以便我可以运行以下查询?

UPDATE DYNAMICS..TABLE2
SET [ProcessedFlag] = 1, [ProcessedDateTime] = GETDATE()
FROM @InsertedValues AS U
    INNER JOIN DYNAMICS..TABLE2 AS R ON U.[ROW_ID] = R.[ROW_ID]
4

4 回答 4

0

使用标准 SQL 无法获得更新的行数,但可能任何数据库都允许这样做。如果您不知道您使用的是什么 RDBMS 以及您从哪里调用 SQL 指令,那么帮助您并不容易。我的意思是在什么 db 客户端应用程序或您正在使用 T-SQL、PL-SQL、pgplsql、java、PHP、c/c++、c#、VB 或您应该说的任何语言开发的应用程序上执行的脚本,可能使用 db -library 你也应该说。

于 2012-08-06T20:56:01.217 回答
0
UPDATE DYNAMICS..TABLE2
SET [ProcessedFlag] = 1, [ProcessedDateTime] = GETDATE()
WHERE
    DYNAMICS..TABLE2.[ProcessedFlag] = 0 AND 
    DYNAMICS..TABLE2.[Action] = 'I' AND 
    DYNAMICS..TABLE2.[DestinationCompany] = 'COMPANY1' AND
    DYNAMICS..TABLE2.[DestinationTable] = 'IV00101'

只需更新您首先选择的同一组记录。

于 2012-08-06T22:02:47.820 回答
0

我会考虑使用 eConnect,因为弄乱 GP 表不是一个好主意(尽管插入 IV00101 应该没问题,因为它是库存主...但仍然!)

你用的是什么版本的GP?GP10 和 GP2010 支持具有允许您插入库存项目的方法的 Web 服务,否则您可以使用 eConnect 并将 XML 文件提供给它将处理的 eConnect 入口点。它还提供验证和错误处理。如果需要,您也可以使用消息队列

您是否尝试从自己的持有表导入 GP 表或类似的东西?

我在工作的地方做了很多 GP 和整合工作:)

于 2012-08-06T22:07:22.740 回答
0

只是一个建议。当您有类似的场景时,您应该使用标识列。因为在那之后使用 @@IDENTITY/SCOPE_IDENTITY()变得非常容易。无论如何,如果该表没有同时进行多个插入,我建议您使用触发器,因为触发器有一些缺点。

于 2012-08-07T03:20:19.040 回答