Sie müssten dynamisches SQL verwenden, um so etwas zu tun.
declare @sql nvarchar(max);
declare @params nvarchar(max);
set @params= N'@pNrodcto int, @pTipodcto int, @pUsuario int, @pEmpresa char(20)';
set @sql = N'INSERT INTO CONTROL_LOGISTICA.dbo.ITEMS_TRAMITE (NRODCTO, TIPODCTO, PRODUCTO, EMPRESA, CODUSUARIO, CODUBICA, CANTIDAD, CCHECK_HIJO)
SELECT @pNrodcto,@pTipodcto,M.PRODUCTO,@pEmpresa,@pUsuario,M.CODUBICA,M.CANTIDAD,0
FROM '+db_name(db_id(@pEmpresa))+'.dbo.MVTRADE M WITH(NOLOCK) --Here im stuck
INNER JOIN Dbo.vReporteMercia_ESP P ON P.PRODUCTO = M.PRODUCTO
WHERE M.CANTIDAD <> 0 AND M.Origen = ''FAC''
AND M.NRODCTO = @pNrodcto AND M.TIPODCTO = @pTipodcto';
exec sp_executesql @sql, @params, @pNrodcto, @pTipodcto, @pUsuario, @pEmpresa;
Um die direkte Verkettung eines Parameters mit einer ausgeführten SQL-Zeichenfolge zu vermeiden, habe ich den Parameter in Aufrufe von db_name()
eingeschlossen und db_id()
. Dies würde null für einen ungültigen Datenbanknamen zurückgeben, würde jedoch niemanden daran hindern, auf eine Datenbank zu verweisen, die Sie nicht möchten. Erwägen Sie, den Parameterwert mit einer weißen Liste zu vergleichen.
Referenz: