数据库技巧

  |  手机版

收藏网站

投稿QQ:1745232315

IT专家网,汇聚专业声音 解析IT潮流 IT专家网,汇聚专业声音 解析IT潮流

网络

专家视点在现场环球瞭望
IT专家网 > 数据库子站 > 数据库技巧

在SQL Server中生成动态SQL语句

作者:阿林出处:IT专家网2008-04-14 09:37

  【IT专家网独家】在需要解决某个棘手的数据库问题时,生成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

相关文章

关键词: 技巧

责任编辑:李书琴

专题推荐

原创文章

微博互动

白皮书

网警备案