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

動的 SQL およびストアド プロシージャの最適化

    複数のネストされた IF ブロックがある場合、SQL Server は実行プランを格納できます。たとえば、IF は単純であると想定しています。 IF @Parameter1 IS NOT NULL

    SchmitzIT の答えは、SQL Server が動的 SQL の実行パスも格納できるという点で正しいです。ただし、これは、SQL が適切に構築および実行されている場合にのみ当てはまります。

    適切に構築されるとは、パラメーターを明示的に宣言し、それらを sp_executesql に渡すことを意味します。例えば

    declare @Param1 nvarchar(255) = 'foo'
            ,@Param2 nvarchar(255) = 'bar'
            ,@sqlcommand nvarchar(max)
            ,@paramList nvarchar(max)
    
    set @paramList = '@Param1 nvarchar(255), @Param2 nvarchar(255)'
    set @sqlcommand = N'Select Something from Table where Field1 = @Param1 AND Field2 = @Param2'
    
    exec sp_executesql @statement = @sqlcommand
                      ,@params = @paramList
                      ,@Param1 = @Param1
                      ,@Param2 = @Param2
    

    ご覧のとおり、sqlcommand テキストは、使用するパラメーター値をハードコーディングしていません。それらは exec sp_executesql で別々に渡されます

    悪い古い動的 sql を記述した場合

    set @sqlcommand = N'Select Something from Table where Field1 = ' + @Param1  + ' AND Field2 = ' + @Param2
    
    exec sp_executesql @sqlcommand
    

    その場合、SQL Server は実行計画を保存できません



    1. PHPとMYSQLを使用したフィールド検索の組み合わせ

    2. MySQLの名前変更列

    3. データベース 'master' でテーブルの作成権限が拒否されました

    4. OracleNumberデータ型から日時形式