在谈论数据库架构的书籍,论坛,电子杂志甚至是博客上,往往认为设计并实现数据库,规划了高效的安全和索引策略就是数据库架构的全部,很少包括数据库访问策略方面的讨论。本文将讨论基于SQL Server作为后台数据库,数据访问方面的策略选择。 基于微软SQL Server数据库应用程序开发,开发人员往往有三种选择,即席SQL(Dynamic SQL),存储过程(Stored Procedure)和CLR(Common Language Runtime)。 即席SQL有时也被称为“动态SQL”,通常指在客户端组织SELECT,INSERT,UPDATE,DELETE以及其他任何SQL 语句,然后……
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】
微信公众号
TechTarget
官方微博
TechTarget中国
在谈论数据库架构的书籍,论坛,电子杂志甚至是博客上,往往认为设计并实现数据库,规划了高效的安全和索引策略就是数据库架构的全部,很少包括数据库访问策略方面的讨论。本文将讨论基于SQL Server作为后台数据库,数据访问方面的策略选择。
基于微软SQL Server数据库应用程序开发,开发人员往往有三种选择,即席SQL(Dynamic SQL),存储过程(Stored Procedure)和CLR(Common Language Runtime)。
即席SQL有时也被称为“动态SQL”,通常指在客户端组织SELECT,INSERT,UPDATE,DELETE以及其他任何SQL 语句,然后,这些SQL 语句被发给SQL Server engine,由SQL Server来检查语法,编译,生成查询计划,执行。 即席SQL 可以分为两类,直接嵌套在C#,VB 或者任何编程语言中,另外一种就是使用像LINQ这样的中间件生成的,这里不讨论这两种方法在生成动态SQL的方面的好处与坏处。
面试数据库开发人员的时候,当我问,谈谈存储过程的优点,面试者可以非常自信地说出很多优点;反之,如果问,谈谈存储过程的缺点,面试者还能口若悬河的就很少了;同样的,如果问动态SQL的坏处,面试者可以说出很多,反之,动态SQL的好处,能说一二的就更少了。
即席SQL
相对于编译好的存储过程,使用未经编译的即席SQL,确实有一些优点。即席SQL可以对查询的运行时控制,查询是在运行时创建的,这样可以根据当时场景,创建精确查询;如SELECT查询,你可以只查询你当前场景需要的数据,如当前需要根据产品ID或者产品的名字,我们只需要构建
"SELECT Name FROM Production.Product WHERE ProductID = " + iProductId.ToString() |
即可,我们不需要去执行一个通用的存储过程,之后获得其中的Name 列的值,如下面的存储过程是根据产品ID或者产品的属性,
CREATE PROC [dbo].[uspGetProcutAttributeListByID] @ProductId INT AS BEGIN SET NOCOUNT ON; SELECT Name, ProductNumber, MakeFlag, FinishedGoodsFlag, Color, SafetyStockLevel, ReorderPoint, StandardCost, ListPrice, ProductLine, Class, Style, SellStartDate, SellEndDate FROM Production.Product WHERE ProductID = @ProductId END |
之后在编程语言中指定存储过程的名字以及所需参数,来执行下面类似语句来获得当前产品ID对应的产品名字;
EXEC [dbo].[uspGetProcutAttributeListByID] @ProductId = 1 |
当然同样的道理,对于UPDATE操作,通过构建即席SQL我们只修改需要更新数据,因为在客户端我们可以在数据被编辑的地方更容易知道数据是否被改变。
另外,灵活性也是即席SQL的一大优势,我们编程的时候常常会遇到这样的情况,根据不同的变量值,执行不同的SQL操作;即席SQL可以充分发挥编程语言的优势,灵活改变;而存储过程里面的SQL编程是面向过程编程,而且SQL的IF – ELSE操作会使得性能严重下降。
下图是LINQ 访问SQL Server的一个简单架构图,从中我可以看出LINQ其实是自动产生动态SQL的一个中间件,可能这个叫法不太合适,不过他是根据C# 语法最终产生SQL,进而发送到SQL Server。
即席SQL的劣势就简要说一下:即席SQL与系统的其他部分相互协作性不强,当前即席SQL只能适用于当前场景,重用性不强;即席SQL耦合度太高,一旦数据库中表定义发生改变,只要涉及到该表的即席SQL都可以面临改动;由SQL注入引发的安全问题更是大家立马就能想到的。
作者
相关推荐
-
云端SQL Server高可用性最佳做法
与内部部署相比,在云端运行SQL Server可为数据库软件用户提供更多的灵活性和可扩展性,也可能更省钱。但云 […]
-
绘制数据关系图的利器:SQL Server 图像数据库工具
SQL Server 2017新增了图形数据库功能,你可以使用图结构来表示不同数据元素之间的关系。
-
如何在Azure部署时选择合适的SQL Server?
想要在Azure上运行SQL Server,企业一般会面临两种选择:在Azure虚拟机上安装SQL Server或使用Azure SQL Database。
-
Linux支持的引入 推动了SQL Server 2016集成服务的发展
随着SQL Server的不断发展,集成服务也在发生相应的变化。在最新的SSIS更新中,增加Linux支持和SQL Server 2016升级向导。