所谓动态SQL,就是执行前语句不确定,执行过程中才知道具体内容的语句。相对来说,静态SQL就是执行前就清楚执行内容的SQL。

举例来说,select * from TableA 就是一个静态SQL。

如果想在执行过程中动态改变表名或者参数,就是动态SQL。比如这个:

 DECLARE @Sql VARCHAR(200);
  DECLARE @GroupName VARCHAR(50);
  SET @GroupName = 'SuperAdmin';
  SET @Sql = 'SELECT * FROM Groups WHERE GroupName=''' + SUBSTRING(@GroupName, 1,5) + ''''
  --PRINT @Sql;
  EXECUTE (@Sql);

动态SQL也可以用存储过程SP_EXECUTESQL来执行,与Execute命令类似。

动态SQL显然比静态SQL更灵活,不过效率上要低于静态SQL,因为静态SQL可以事先编译。另外动态SQL安全上也可以产生注入漏洞。还有就是代码可读性上来说动态SQL不如静态SQL。

我前一段时间做了几个T-SQL编程项目,在不改变需求的情况下避免了使用动态SQL,以下是一些具体的做法。

1:使用临时表来保存变量。下面例子中@StaffName可以输入一个或多个员工姓名,也可以为空,为空的话表示要查全部员工的信息。

 if @StaffName = ''
  insert into #StaffName(StaffName)
  select distinct StaffName
  from Staff s
  where BeginDate <= @DateEnd and EndDate >= @DateStart
 else
  insert into #StaffName
  SELECT *
  FROM dbo.fn_split_string(@StaffName,',')
  
 select *
 from dbo.class c(nolock)
  inner join dbo.class_detail d(nolock) on c.class_id = d.class_id
  inner join dbo.calendar ca (nolock) on ca.date between l.leave_str and l.leave_end
   and ca.weekday = d.class_time
  inner join #StaffName s on l.staff_name = s.StaffName
  
其中fn_split_string是一个把字符串拆为表的函数。

2:在where子句中做文章。下面这个例子中,如果设置@Price为-1,表示不使用这个参数去限制记录集。否则这个参数有效。

 declare @Price int
 set @Price = -1

 SELECT *
 FROM TableA
 where (@Price > HighestPrice or @Price = -1)

 

作者: 左其盛 发表于 2011-04-10 22:22 原文链接

推荐.NET配套的通用数据层ORM框架:CYQ.Data 通用数据层框架