Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Verketten Sie den Datenbanknamen in einem mehrteiligen SQL-Bezeichner

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: