sql >> データベース >  >> RDS >> Sqlserver

データベース名を SQL マルチパート識別子に連結する

    そのようなことを行うには、動的 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;
    

    パラメータを実行された SQL 文字列に直接連結することを避けるために、db_name() への呼び出しでパラメータをラップしました および db_id() .これは、無効なデータベース名に対して null を返しますが、誰かが参照したくないデータベースを参照するのを止めることはできません。パラメータ値をホワイト リストと比較することを検討してください。

    参照:



    1. Android-2つのテーブルに関連するデータをコンテンツプロバイダーの挿入メソッドに渡すにはどうすればよいですか?

    2. VBAを介してExcelをPostgreSQLに接続する

    3. mysqlパスワードPHPを使用したMySQLへの接続

    4. Oracleにルート要素がないclobのxmlルート要素を作成します