- Rongsen.Com.Cn 版权所有 2008-2010 京ICP备08007000号 京公海网安备11010802026356号 朝阳网安编号:110105199号
- 北京黑客防线网安工作室-黑客防线网安服务器维护基地为您提供专业的服务器维护,企业网站维护,网站维护服务
- (建议采用1024×768分辨率,以达到最佳视觉效果) Powered by 黑客防线网安 ©2009-2010 www.rongsen.com.cn
 
  
    
| 作者:黑客防线网安SQL维护基地 来源:黑客防线网安SQL维护基地 浏览次数:0 | 
    在需要解决某个棘手的数据库问题时,生成SQL语句可作为一种强大的工具,虽然我们在使用它时必须十分小心。本文将探讨如何用这种功能来轻松地生成SQL语句。 
  动态SQL语句
一个动态的SQL语句是在执行时创建的,不同的条件生成不同的SQL语句。在我们需要决定运行时有哪些字段从SELECT语句返回时,在决定查询的不同标准时,动态地创建这些语句是很有用处的。
这些SQL字符串不是为了语法分析以便于查找错误,因为它们是在运行时生成的,而且它们有可能将安全漏洞引入到你的数据库中。此外,SQL字符串有可能成为一个调试上恶梦,这就是为什么笔者并非动态生成SQL语句的一个痴迷者的原因。但在有些情况下,这种功能却是很不错的。
一个动态的例子
笔者经常回答的一个问题是“我如何将我的WHERE语句传递给一个存储过程?”,而且经常看到类似于下面的情况,其TSQL语法是非法的。
  DECLARE @WhereClause NVARCHAR(2000) 
  SET @WhereClause = ' Prouct = ''Computer''' 
  SELECT * FROM SalesHistory WHERE @WhereClause 
  但情况并不如此简单,有时,需要额外的标准,而且随着数据表的逐渐增大,就需要越来越多的标准。这通常可以通过为不同的标准编写不同的存储过程而解决,不过有时每次执行的这种标准是如此迥然不同,以至于在一个存储过程中包含所有的可能性可能成为一个沉重的负担。虽然这些存储过程可以用于考虑每一个可能的WHERE语句,(当然这要依赖于不同的参数) ,这通常会引起性能上的降低,因为在WHERE子句中有太多的条件。
让我们看看如何创建一个简单的动态查询。首先,我们需要一个表和一些查询的数据。下面的脚本创建了SalesHistory表并将数据装载到其中。
  CREATE TABLE [dbo].[SalesHistory] 
  ( 
  [SaleID] [int] IDENTITY(1,1), 
  [Product] [varchar](10) NULL, 
  [SaleDate] [datetime] NULL, 
  [SalePrice] [money] NULL 
  ) 
  GO 
  SET NOCOUNT ON 
  DECLARE @i INT 
  SET @i = 1 
  WHILE (@i <=5000) 
  BEGIN 
  INSERT INTO [SalesHistory](Product, SaleDate, SalePrice) 
  VALUES ('Computer', DATEADD(ww, @i, '3/11/1919'), 
  DATEPART(ms, GETDATE()) + (@i + 57)) 
  INSERT INTO [SalesHistory](Product, SaleDate, SalePrice) 
  VALUES('BigScreen', DATEADD(ww, @i, '3/11/1927'), 
  DATEPART(ms, GETDATE()) + (@i + 13)) 
  INSERT INTO [SalesHistory](Product, SaleDate, SalePrice) 
  VALUES('PoolTable', DATEADD(ww, @i, '3/11/1908'), 
  DATEPART(ms, GETDATE()) + (@i + 29)) 
  SET @i = @i + 1 
  END 
 
下面我们创建一个可以接受WHERE子句的存储过程。为了达成这个例子的目的,笔者将假定WHERE子句是从调用客
| 我要申请本站:N点 | 黑客防线官网 | | 
| 专业服务器维护及网站维护手工安全搭建环境,网站安全加固服务。黑客防线网安服务器维护基地招商进行中!QQ:29769479 |