sql >> Databasteknik >  >> RDS >> Sqlserver

Sammanfoga databasnamnet i en SQL-identifierare med flera delar

Du skulle behöva använda dynamisk sql för att göra något sådant.

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;

För att undvika direkt sammanlänkning av en parameter till en exekverad sql-sträng lade jag parametern in i anrop till db_name() och db_id() . Detta skulle returnera null för ett ogiltigt databasnamn, men skulle inte hindra någon från att referera till en databas som du inte vill att de ska göra. Överväg att jämföra parametervärdet med en vit lista.

Referens:



  1. Kan PHP mysqli ställa in timeout vid anslutningsförsök?

  2. IRI produktnomenklatur och arkitektur

  3. Tips för att migrera från HAProxy till ProxySQL

  4. Uppdaterar flera rader med en array