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

どうすれば次のようなことができますか:USE @databaseName

    このように動的に実行する場合は、動的SQLを使用する必要があります。そのDBのコンテキストで実行したいものは何でも意味しますが、動的SQLステートメントにも含める必要があります。

    つまり、MainDB内のすべてのテーブルを一覧表示するとします。

    USEステートメントは別のコンテキストにあるため、これは機能しません。EXECUTEが実行されると、次のSELECTは同じコンテキストで実行されないため、MainDbでは実行されません(接続がすでにに設定されている場合を除く)。 MainDb)

    DECLARE @DatabaseName NVARCHAR(MAX)
    SET @DatabaseName = 'MainDb'
    EXECUTE('USE ' + @DatabaseName) -- SQL injection risk!
    SELECT name FROM sys.tables
    

    したがって、次のことを行う必要があります:

    DECLARE @DatabaseName NVARCHAR(MAX)
    SET @DatabaseName = 'MainDb'
    EXECUTE('USE ' + @DatabaseName + ';SELECT name FROM sys.tables') -- SQL injection risk!
    

    もちろん、SQLインジェクションには細心の注意を払う必要があります。そのために、バリーの回答のリンクを示します。

    SQLインジェクションを防ぐために、QUOTENAME()関数を使用することもできます。これは、パラメーターを角かっこで囲みます。

    DECLARE @DatabaseName sysname = 'MainDb'
        , @SQL NVARCHAR(MAX);
    
    SET @SQL = N'USE ' + QUOTENAME(@DatabaseName);
    
    PRINT(@SQL);
    -- USE [MainDb]
    
    EXECUTE(@SQL);
    


    1. rownumを使用してテーブルの2番目の行を選択する

    2. sqliteで正規表現を使用する方法

    3. CRS 11.2.0

    4. OracleODP.NetおよびEFCodeFirstと連携するようにDbContextを構成するにはどうすればよいですか。