Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Concaténer le nom de la base de données dans un identifiant multipartie SQL

Vous auriez à utiliser sql dynamique pour faire quelque chose comme ça.

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;

Pour éviter de concaténer directement un paramètre à une chaîne sql exécutée, j'ai enveloppé le paramètre dans des appels à db_name() et db_id() . Cela renverrait null pour un nom de base de données invalide, mais n'empêcherait pas quelqu'un de référencer une base de données que vous ne voulez pas qu'il fasse. Envisagez de comparer la valeur du paramètre à une liste blanche.

Référence :