SQL Server 数据访问策略:即席SQL

日期: 2011-05-25 作者:李爱华 来源:TechTarget中国

在谈论数据库架构的书籍,论坛,电子杂志甚至是博客上,往往认为设计并实现数据库,规划了高效的安全和索引策略就是数据库架构的全部,很少包括数据库访问策略方面的讨论。本文将讨论基于SQL Server作为后台数据库,数据访问方面的策略选择。   基于微软SQL Server数据库应用程序开发,开发人员往往有三种选择,即席SQL(Dynamic SQL),存储过程(Stored Procedure)和CLR(Common Language Runtime)。   即席SQL有时也被称为“动态SQL”,通常指在客户端组织SELECT,INSERT,UPDATE,DELETE以及其他任何SQL 语句,然后……

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

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注入引发的安全问题更是大家立马就能想到的。

相关推荐