在插入查询中通过输出获得的id需要传递给另一个插入查询

问题描述 投票:0回答:1

直到这一行

EXEC sp_executesql @InsertQuery, N'@product_id BIGINT OUTPUT', @product_id OUTPUT

我设法正确获取product_id,问题是在@InsertQuery2中插入时,它插入product_id = NULL

DECLARE @InsertQuery NVARCHAR(MAX)

    SET @InsertQuery = '
        INSERT INTO ' + QUOTENAME(@bdEmpresa) + '.dbo.Producto (
            producto_codigo,
            producto_codigoanterior,
            producto_status
        )
        OUTPUT INSERTED.producto_id
        SELECT 
            producto_codigo,
            producto_codigoanterior,
            producto_status
        FROM #TempProducto'

    -- Ejecutar la consulta de inserción y capturar el producto_id generado
    EXEC sp_executesql @InsertQuery, N'@producto_id BIGINT OUTPUT', @producto_id OUTPUT

    -- Insertar datos de proveedores en la tabla de la base de datos de la empresa
    DECLARE @InsertQuery2 NVARCHAR(MAX)

    SET @InsertQuery2 = '
        INSERT INTO ' + QUOTENAME(@bdEmpresa) + '.dbo.ProductoProveedor (
            producto_id,
            proveedor_ruc,
            proveedor_dscto
        )
        SELECT 
            @producto_id,
            proveedor_ruc,
            proveedor_dscto
        FROM #TempProveedores'

    -- Ejecutar la consulta de inserción
    EXEC sp_executesql @InsertQuery2, N'@producto_id BIGINT', @producto_id

我需要将在Product表中注册后获得的id传递给@InsertQuery2,因为我也需要在那里插入它

sql-server t-sql stored-procedures exec sql-insert
1个回答
0
投票

OUTPUT
返回整个结果集。要在另一个查询中捕获并重用它,您需要添加
INTO someTable

此外,您可以构造一个包含

SomeDb.sys.sp_executesql
的变量,然后执行
EXEC @proc

,而不是注入数据库名称
DECLARE @InsertQuery NVARCHAR(MAX) = '

DECLARE @ids TABLE (id bigint NOT NULL);

INSERT INTO dbo.Producto (
    producto_codigo,
    producto_codigoanterior,
    producto_status
)
OUTPUT INSERTED.producto_id
INTO @ids (id)
SELECT 
    producto_codigo,
    producto_codigoanterior,
    producto_status
FROM #TempProducto;

INSERT INTO dbo.ProductoProveedor (
    producto_id,
    proveedor_ruc,
    proveedor_dscto
)
SELECT 
    i.id,
    p.proveedor_ruc,
    p.proveedor_dscto
FROM #TempProveedores p
CROSS JOIN @ids AS i;    -- shouldn't this have some kind of join condition
';

DECLARE @proc nvarchar(1000) = QUOTENAME(@bdEmpresa) + '.sys.sp_executesql';

EXEC @proc @InsertQuery;
© www.soinside.com 2019 - 2024. All rights reserved.