所谓动态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) |
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】
微信公众号
TechTarget
官方微博
TechTarget中国
作者
相关推荐
-
OpenWorld18大会:Ellison宣布数据库的搜寻和破坏任务
在旧金山举行的甲骨文OpenWorld 2018大会中,甲骨文首席技术官(CTO)兼创始人Larry Elli […]
-
ObjectRocket着力发展Azure MongoDB服务
MongoDB吸引了微软公司的注意力,微软公司计划针对运行于该公司2017年发布的Azure Cosmos D […]
-
数据库和数据仓库的区别在哪儿?
目前,大部分数据仓库还是用数据库进行管理。数据库是整个数据仓库环境的核心,是数据存放的地方和提供对数据检索的支持。
-
如何使用服务来平衡Oracle RAC 数据库工作负载
为不同的应用程序配置不同的服务,DBA可以更有效地平衡集群工作负载,在Oracle RAC数据库环境下实现更好的应用程序性能。