1

我有一个带有,的customer表格,并且搜索基于以上三个中的任何一个或全部。Cust_IdNameCity

我应该去哪一个?

  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/changeing-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 注入的影响。但是,它优于“非动态”/简单或查询。

在此处阅读更多相关信息。 http://blogs.lessthandot.com/index.php/DataMgmt/DBProgramming/do-you-use-column-param-or-param-is-null

于 2012-04-09T13:20:13.097 回答
4

动态 SQL 可能具有更高的性能,这在搜索中通常很重要。

但是,编写和调试和测试比较困难。首先,您需要确保它不会允许 SQL 注入攻击。接下来,您需要确保您使用的变量足够大以包含您将创建的最大可能的最终 SQl 语句。

然后你需要创建大量的测试用例来确保没有某种微妙的错误。

您还需要授予对基础表的读取权限,如果您使用存储过程,通常不需要这样做。

最后,在存储过程中执行动态 SQL 时,请添加一个名为 @debug 的输入变量作为最后一个输入变量,并给它一个默认值 0。当传入 1 时,它会发送给您,而不是执行动态 SQL创建的 SQL。这将帮助您调试 proc,并且在将来的某些搜索中出现错误时特别有用,因为您可以准确地看到为这些值运行的 SQL。

于 2012-04-09T13:38:05.883 回答
1

根据我的经验,动态 SQL 仅在减少 JOIN 数量时才有意义(提高性能)。

否则只会恶化代码的可读性和可维护性。

于 2012-04-09T12:35:44.960 回答