1

、を含むcustomerテーブルがCust_Idあり、検索は上記の 3 つのいずれかまたはすべてに基づいています。NameCity

どちらに行けばいいですか?

  1. 動的 SQL:

    declare @str varchar(1000)
    set @str = 'Select [Sno],[Cust_Id],[Name],[City],[Country],[State] 
                from Customer where 1 = 1'
    if (@Cust_Id != '')
        set @str = @str + ' and Cust_Id    =  ''' + @Cust_Id + ''''
    if (@Name != '')
        set @str = @str + ' and Name like ''' + @Name + '%'''
    if (@City  != '')
        set @str = @str + ' and City like ''' + @City + '%'''
    exec (@str)
    
  2. 簡単なクエリ:

    select
        [Sno],[Cust_Id],[Name],[City],[Country],[State]
    from
        Customer
    where
        (@Cust_Id  = '' or Cust_Id    =  @Cust_Id) and
        (@Name     = '' or Name     like @Name + '%') and
        (@City     = '' or City     like @City + '%')
    

どちらを優先する必要がありますか (1 または 2)、利点は何ですか?

みんなの提案を経て、最終的に得たものがここにあります。

  DECLARE @str NVARCHAR(1000)
  DECLARE @ParametersDefinition NVARCHAR(500)
  SET @ParametersDefinition = N'@InnerCust_Id varchar(10),
                              @InnerName varchar(30),@InnerCity varchar(30)'


 SET @str = 'Select [Sno],[Cust_Id],[Name],[City],[Country],[State]
                                          from Customer where 1 = 1'

 IF(@Cust_Id != '')
    SET @str = @str + ' and Cust_Id = @InnerCust_Id'
 IF(@Name != '')
    SET @str = @str + ' and Name like @InnerName'
 IF(@City  != '')
    SET @str = @str + ' and City like @InnerCity'


-- ADD the % symbol for search based upon the LIKE keyword
SELECT  @Name = @Name + '%', @City = @City+ '%'

EXEC sp_executesql @str, @ParametersDefinition,
                      @InnerCust_Id = @Cust_Id,
                      @InnerName    = @Name,
                      @InnerCity    = @City;

:@Cust_Idとは@Name@Cityストアド プロシージャに渡されるパラメーターです。

参照: http://blogs.lessthandot.com/index.php/DataMgmt/DataDesign/ching-exec-to-sp_executesql-doesn-tp

http://www.sommarskog.se/dynamic_sql.html

http://msdn.microsoft.com/en-us/library/ms175170.aspx

4

3 に答える 3

4

動的 SQL は、検索で一般的に重要なパフォーマンスが向上する可能性があります。

ただし、作成、デバッグ、およびテストはより困難です。まず、SQL インジェクション攻撃が許可されないことを確認する必要があります。次に、使用する変数が、作成する可能性のある最大の最終 SQl ステートメントを含むのに十分な大きさであることを確認する必要があります。

次に、ある種の微妙なバグがないことを確認するために、十分な数のテスト ケースを作成する必要があります。

また、ストアド プロシージャを使用する場合、通常は必要のない基になるテーブルへの読み取りアクセス許可を付与する必要があります。

最後に、ストアド プロシージャで動的 SQL を実行する場合は、@debug という入力変数を最後の入力変数として追加し、デフォルト値の 0 を指定してください。1 が渡されると、動的 SQL を実行する代わりに、作成される SQL。これは、proc のデバッグに役立ちます。また、これらの値に対して実行された SQL を正確に確認できるため、今後の検索でエラーが発生した場合に特に役立ちます。

于 2012-04-09T13:38:05.883 に答える
4

動的 SQL を記述するのは少し難しく、注意しないと SQL インジェクションに対して脆弱です。ただし、「非動的」/シンプルまたはクエリよりも優れています。

詳しくはこちらをご覧ください。 http://blogs.lessthandot.com/index.php/DataMgmt/DBProgramming/do-you-use-column-param-or-param-is-null

于 2012-04-09T13:20:13.097 に答える
1

私の経験からすると、動的 SQL は JOIN の数を減らすことだけに意味があります (パフォーマンスが向上します)。

そうしないと、コードの可読性と保守性が低下するだけです。

于 2012-04-09T12:35:44.960 に答える