这是一个有效的SQL服务器查询吗?

时间:2009-01-20 21:08:05

标签: sql-server performance tsql

如果我用这种格式写一个sproc,sql server会有效地执行此操作,还是应该在服务器端(.net)完成sql'weaving'?

注意:这只是我的查询的粗略概念,有更多'if'子句构建我使用'exec'执行的查询

declare @sql nvarchar(4000)
declare @order nvarchar(4000)


set @sql = 'select id, name'
set @sql = @sql + ' ....' 

if(@sortOrder)
    set @order = 'order by name desc'

exec @sql + @order

9 个答案:

答案 0 :(得分:4)

为什么不按顺序使用case语句?

,而不是构建一个SQL字符串

e.g。 (假设一个用FirstName和LastName字段在表上按名字和/或姓氏排序)

order by
  case 
  when @sortExpression = 'lastname asc' then CAST(LastName as sql_variant)
  when @sortExpression = 'firstname asc' then CAST(FirstName as sql_variant)
  end asc,
  case
  when @sortExpression = 'lastname desc' then CAST(LastName as sql_variant)
  when @sortExpression = 'firstname desc' then CAST(FirstName as sql_variant)
  end desc

此外,如果您的order by子句每次都通过动态SQL不同,则永远不会重复使用查询计划。

答案 1 :(得分:2)

最清晰,最简单,最简单,最优化的方法是为每个选项提供完整的SQL语句。

答案 2 :(得分:1)

我认为有两种更好的方法可以做到这一点。我会在存储过程中使用实际的SQL语句,而不是使用动态SQL查询,而是根据您要订购的内容进行排序:

select
  t.* 
from 
  table as t 
order by
  case @val
    when 1 then column1
    when 2 then column2
  end

如果您发现order by太动态且必须构建,或者更容易这样做,那么我将创建一个表值函数,它返回集合,然后创建一个动态的sql语句:

select
  t.*
from
  xfn_Function(@arg1, @arg2) as t
order by
  t.col1, t.col2

当然,在将整个事物发送到服务器之前,动态生成t.col1,t.col2等等。

答案 3 :(得分:0)

您是否有充分的理由将其作为动态SQL?

我已经在SQL服务器中完成了之前的工作并且工作正常;它可能比完全形成的SQL传递给盲目运行它的proc更安全(取决于用法)。

如果您使用的是SQL 2k5或2k8,则可以将nvarchar(max)用于更长的字符串。

答案 4 :(得分:0)

要专门回答您的问题,在.Net层中形成的动态SQL语句与在proc中形成的完全相同的SQL字符串之间根本没有性能差异。

答案 5 :(得分:0)

最有效的方法是从数据库中获取所需的任何数据,然后在应用程序中处理排序。更改顺序不会改变数据量。如果用户更改排序顺序,为什么要再次访问数据库?

答案 6 :(得分:0)

动态查询性能几乎等同于服务器端编织。如果您找不到任何其他方法来避免动态查询,请将其嵌套在服务器端。

如果你没有很多“ifs”

以下也适用

if(@sortorder = 'name') select id, name from tbl order by name asc
if(@sortorder = 'id') select id, name from tbl order by id asc

答案 7 :(得分:-1)

它在“exec”命令中编译。速度差异应该是最小的,并且在.NET端完成所有操作。

在某些时候,它会将SQL编译为一些内部代码。它可能发生在.NET推送它或之后。

答案 8 :(得分:-5)

我会通过ie。

构建查询的其余部分
@sql = 'SELECT id, name FROM myTable ORDER BY ' + @order

...并将列名称和方向传递给proc。这种方式更安全,因为没有太多可以传递给order by子句来造成任何伤害。

回答你的问题,是的,效率很高。