Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Połącz nazwę bazy danych w wieloczęściowym identyfikatorze SQL

Aby zrobić coś takiego, musiałbyś użyć dynamicznego sql.

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;

Aby uniknąć bezpośredniego łączenia parametru z wykonywanym ciągiem sql, umieściłem parametr w wywołaniach db_name() i db_id() . Zwróciłoby to wartość null dla nieprawidłowej nazwy bazy danych, ale nie powstrzymałoby kogoś przed odwoływaniem się do bazy danych, której nie chcesz. Rozważ porównanie wartości parametru z białą listą.

Odniesienie:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak połączyć wiele wierszy w listę rozdzielaną przecinkami w SQL Server 2005?

  2. Automatyzacja pobierania numeru wersji z plików .dtsx

  3. Najszybszy sposób na to zapytanie (Jaka jest najlepsza strategia) biorąc pod uwagę zakres dat

  4. Błąd HTTP 500.22 — wewnętrzny błąd serwera (wykryto ustawienie ASP.NET, które nie ma zastosowania w trybie zintegrowanego zarządzanego potoku).

  5. Prosty sposób na transponowanie kolumn i wierszy w SQL?