直到这一行
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,因为我也需要在那里插入它
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;