动态SQL语句基本语法

动态SQL语句基本语法
动态SQL语句基本语法

学习SQL应知道的动态SQL语句基本语法

1 、普通SQL语句可以用Exec执行

eg: Select * from tableName

Exec('select * from tableName')

Exec sp_executesql N'select * from tableName' -- 请注意字符串前一定要加N

2、字段名,表名,数据库名之类作为变量时,必须用动态SQL

eg:

declare @fname varchar(20)

set @fname = 'FiledName'

Select @fname from tableName -- 错误,不会提示错误,但结果为固定值FiledName,并非所要。

Exec('select ' + @fname + ' from tableName') -- 请注意加号前后的单引号的边上加空格

当然将字符串改成变量的形式也可

declare @fname varchar(20)

set @fname = 'FiledName' --设置字段名

declare @s varchar(1000)

set @s = 'select ' + @fname + ' from tableName'

Exec(@s) -- 成功

exec sp_executesql @s -- 此句会报错

declare @s Nvarchar(1000) -- 注意此处改为nvarchar(1000)

set @s = 'select ' + @fname + ' from tableName'

Exec(@s) -- 成功

exec sp_executesql @s -- 此句正确

3、输出参数

declare @num int,

@sqls nvarchar(4000)

set @sqls='select count(*) from tableName'

exec(@sqls)

--如何将exec执行结果放入变量中?

declare @num int,

@sqls nvarchar(4000)

set @sqls='select @a=count(*) from tableName '

exec sp_executesql @sqls,N'@a int output',@num output

select @num

此外,如果想要在SQL语句字符串中使用单引号'' 可以使用''''

SQL Server数据库中经常用到的identity列

【赛迪网-IT技术报道】SQL Server中,经常会用到Identity标识列,这种自增长的字段操作起来的确是比较方便。但它有时还会带来一些麻烦。

示例一:当表中被删除了某些数据的时候,自增长列的编号就不再是一个连线的数列。这种时候我们可以用以下方案来解决。

允许将显式值插入表的标识列中,当设置为ON时,这时可能在INSERT操作时手工指定插入到标识列中的编号,同时必须在操作完成后,将IDENTITY_INSERT还原成OFF,否则下次插入的时候必须指定编号,那不然就无法完成INSERT操作。

示例二:当表中的记录被全部删除,但此时标识列的值越来越大的时候,如果不加以重置,它还会无休止的增长。这个时候我们就要用到:

将把指定表的种子值强制重设为1。然而,你可能不想将种子重设为1,在这种情况下,你可以用你想用的种子值替代第三个参数。有时候你可能想知道当前的种子,而不是想重设种子,这时你就要用到NORESEED,而不用再去顾忌第三个参数。

“一网打尽”通用SQL数据库的查询语句(1)通用SQL数据库的查询语句:

(注释:本文中Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。)

一、简单查询

简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的表或视图、以及搜索条件等。

例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。

(一) 选择列表

选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变量和全局变量)等构成。

1、选择所有列

例如,下面语句显示testtable表中所有列的数据:

2、选择部分列并指定它们的显示次序

查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。

3、更改列标题

在选择列表中,可重新指定列标题。定义格式为:

列标题=列名

列名列标题

如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列标题:

4、删除重复行

SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT 返回的结果集合中只保留一行。

5、限制返回的行数

使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是表示一百分数,指定返回的行数等于总行数的百分之几。

(二)FROM子句

FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图,它们之间用逗号分隔。

在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应使用下面语句格式加以限定:

在FROM子句中可用以下两种格式为表或视图指定别名:

表名as 别名

表名别名

例如上面语句可用表的别名格式表示为:

SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。

此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。

(三) 使用WHERE子句设置查询条件

WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据:

WHERE子句可包括各种条件运算符:

比较运算符(大小比较):> 、> =、=、<、<=、<> 、!> 、! <

范围运算符(表达式值是否在指定的范围):BETWEEN…AND…

NOT BETWEEN…AND…

列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……)

NOT IN (项1,项2……)

模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE

空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL

逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR

1、范围运算符例:age BETWEEN 10 AND 30相当于age> =10 AND age <=30

2、列表运算符例:country IN ( 'Germany ', 'China ')

3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、varchar、text、ntext、datetime和smalldatetime等类型查询。

可使用以下通配字符:

百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。

下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。

方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。

例如:

限制以Publishing结尾,使用LIKE '%Publishing '

限制以A开头:LIKE '[A]% '

限制以A开头外:LIKE '[^A]% '

4、空值判断符例WHERE age IS NULL

5、逻辑运算符:优先级为NOT、AND、OR

(四)查询结果排序

使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为:

其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image 数据类型进行排序。

另外,可以根据表达式进行排序。

二、联合查询

UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联合查询。UNION的语法格式为:

其中selectstatement为待联合的SELECT查询语句。

ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一行。

联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。

在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类型,系统将低精度的数据类型转换为高精度的数据类型。

在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如:

查询1 UNION (查询2 UNION 查询3)

三、连接查询

通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型数据库管理系统的一个标志。

在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行查询。

连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM 子句中指出连接时有助于将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。

SQL-92标准所定义的FROM子句的连接语法格式为:

其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一个表操作的连接又称做自连接。

join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或

RIGHT JOIN)和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的数据行。

交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。

连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑运算符等构成。

无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接连接。例如:

(一)内连接

内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分三种:

1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接表中的所有列,包括其中的重复列。

2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些运算符包括> 、> =、<=、<、!> 、! <和<> 。

3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询结果集合中所包括的列,并删除连接表中的重复列。

例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社:

又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state):

(二)外连接

内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或HAVING 条件)和连接条件的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。如下面使用左外连接将论坛内容和作者信息连接起来:

下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市:

(三)交叉连接

交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等。

教你快速掌握一些异常精妙的"SQL"语句

赛迪网-IT技术报道】精妙的"SQL"语句:

◆复制表(只复制结构,源表名:a 新表名:b)

◆拷贝表(拷贝数据,源表名:a 目标表名:b)

◆显示文章、提交人和最后回复时间

◆说明:外连接查询(表名1:a 表名2:b)

◆日程安排提前五分钟提醒

◆两张关联表,删除主表中已经在副表中没有的信息

◆说明:

◆说明:

实例讲解SQL Server中"Update"的用法SQL Server中"Update"的用法:

例子:

在表中有两个字段:id_no (varchar) , in_date (datetime) ,把in_date相同的记录的in_date 依次累加1秒,使in_date没有相同的记录。

以下为原始的数据:

结果为:

处理的方法:

三种数据库利用SQL语句进行高效果分页

在程序的开发过程中,处理分页是大家接触比较频繁的事件,因为现在软件基本上都是与数据库进行挂钓的。但效率又是我们所追求的,如果是像原来那样把所有满足条件的记录全部都选择出来,再去进行分页处理,那么就会多多的浪费掉许多的系统处理时间。为了能够把效率提高,所以现在我们就只选择我们需要的数据,减少数据库的处理时间,以下就是

常用SQL分页处理:

1、SQL Server、Access数据库

这都微软的数据库,都是一家人,基本的操作都是差不多,常采用如下分页语句:

PAGESIZE:每页显示的记录数

CURRENTPAGE:当前页号

数据表的名字是:components

索引主键字是:id

如下列:

2、Oracle数据库

因为Oracle数据库没有Top关键字,所以这里就不能够像微软的数据据那样操作,这里有两种方法:

(1)、一种是利用相反的。

PAGESIZE:每页显示的记录数

CURRENTPAGE:当前页号

数据表的名字是:components

索引主键字是:id

如下例:

从101到记录开始选择,选择前面10条。

(2)、使用minus,即中文的意思就是减去。

(3)、一种是利用Oracle的rownum,这个是Oracle查询自动返回的序号,一般不显示,但是可以通过select rownum from [表名]看到,注意,它是从1到当前的记录总数。

深入讲解SQL Server数据库的嵌套子查询

很多人对子查询(subqueries)的使用都感到很迷惑,尤其对于嵌套子查询(即子查询中包含一个子查询)。现在,就让我们追本溯源地探究这个问题。

有两种子查询类型:标准和相关。标准子查询执行一次,结果反馈给父查询。相关子查询每行执行一次,由父查询找回。在本文中,我将重点讨论嵌套子查询(nested subqueries)(我

将在以后介绍相关子查询)。

试想这个问题:你想生成一个卖平垫圈的销售人员列表。你需要的数据分散在四个表格中:人员.联系方式(Person.Contact),人力资源.员工(HumanResources.Employee),销售.销售订单标题(Sales.SalesOrderHeader),销售.销售订单详情(Sales.SalesOrderDetail)。在SQL Server 中,你从内压式(outside-in)写程序,但从外压式(inside-out)开始考虑非常有帮助,即可以一次解决需要的一个语句。

如果从内到外写起,可以检查Sales.SalesOrderDetail表格,在LIKE语句中匹配产品数(ProductNumber)值。你将这些行与Sales.SalesOrderHeader表格连接,从中可以获得销售人员IDs(SalesPersonIDs)。然后使用SalesPersonID连接SalesPersonID表格。最后,使用ContactID 连接Person.Contact表格。

这个例子揭示了有关SQL Server的几个绝妙事情。你可以发现,可以用IN()参数替代SELECT 语句。在本例中,有两次应用,因此创建了一个嵌套子查询。

我是标准化(normalization)的发烧友,尽管我不接受其荒谬的长度。由于标准化具有各种查询而增加了复杂性。在这些情况下子查询就显得非常有用,嵌套子查询甚至更加有用。

当你需要的问题分散于很多表格中时,你必须再次将它们拼在一起,这时你可能发现嵌套子程序就很有用。

动态SQL总结

关于动态SQL的一些总结 目的 动态SQL用于减小程序消耗并获取较高的执行性能,且容易编码,现越来越广泛的应用于数据库程序开发中。在SQL中,可以采用多种方式构造和执行动态SQL,比如EXECUTE IMMEDIATE、DBMS_SQL包等。由于ORACLE手册中并未覆盖这些功能,现简单说明下关于EXECUTE IMMEDIATE的用法。 名词定义 Oracle数据库开发PL/SQL块,常用SQL分为:静态SQL语句和动态SQL语句。 静态SQL,指在PL/SQL块中使用的SQL语句在编译时是明确的,执行的是确定对象。而动态SQL是指在PL/SQL块编译时SQL语句是不确定的,如根据用户输入的参数的不同而执行不同的操作。编译程序对动态语句部分不进行处理,只是在程序运行时动态地创建语句、对语句进行语法分析并执行该语句。 处理范围 ◆语句可变:允许用户在程序运行时,临时动态创建完整的语句 ◆条件可变:对于查询语句而言,语句的输出是确定的,但是查询子句(如WHERE 子句,GROUP BY子句,HAVING子句等)可变 ◆数据库对象等其他可变:对于别名,查询的表名、视图、过程名、DBLINK名等, 临时构建,均不确定。 语法 EXECUTE IMMEDIATEdynamic_string [INTO {define_variable [ , define_variable ] … |record}] [USING [IN | OUT | IN OUT ] bing_argument [, [IN | OUT | IN OUT ] bing_argument] … ]

[{RETURNING | RETURN} INTObind_argument [,bind_argument] … ] ◆dynamic_string用于指定存放SQL语句或PL/SQL块的字符串变量;define_variable 用于指定存放单行查询结果的变量;bind_argument用于存放传递的输入、输出变量。 ◆dynamic_string语句需用单引号括起来,需要使用特殊符号的地方需注意转义,如使 用引号时,用’’代替’;需要使用变量的地方,可以直接用:号加变量名,也可以用 || 连接符将直接调用变量。区别在于EXECUTE IMMEDIATE语句中,前者需要加USING传入变量,后者不用。 使用范例 1.一般执行语句: Begin EXECUTEIMMEDIATE'create table tab_test(test_code varchar2(200),test_value varchar2(20),remark varchar2(200))'; End; 2.带传入参数的动态语句(USING语句): 3.带传出参数的动态语句(INTO语句):

学习SQL应知道的动态SQL语句基本语法

精妙SQL详解 本文档由周公(周金桥)从网上搜集整理。版权归原作者所有。 欢迎访问本人博客:https://www.360docs.net/doc/f215318946.html,/zhoufoxcn 2008-10-12 周公 目录 学习SQL应知道的动态SQL语句基本语法 (2) SQL Server数据库中经常用到的identity列 (3) “一网打尽”通用SQL数据库的查询语句(1) (3) 教你快速掌握一些异常精妙的"SQL"语句 (6) 实例讲解SQL Server中"Update"的用法 (7) 三种数据库利用SQL语句进行高效果分页 (8) 深入讲解SQL Server数据库的嵌套子查询 (9) 使用SQL视图查出所有的数据库字典 (10) 两个表间不存在的insert与存在的update (12) 实现跨多个表格的数据进行组合的SQL语句(1) (15) 深入讲解SQL Union和Union All的使用方法 (16) 巧用一条SQL 实现其它进制到十进制转换 (18) 实例讲解如何才能让你的SQL运行得更快(1) (19) 利用"SQL"语句自动生成序号的两种方式 (21) 详细讲解有关获取当月天数的实用技巧 (22) 为什么SQL不许在视图定义ORDER BY子句 (23) 一条SQL语句变得巨慢的原因及其解决方法 (23) 教你快速掌握SQL语句各种写法的效率问题 (24) 通过两个例子讲解PIVOT/UNPIVOT的用法 (25) 用一个实例讲解GROUP BY CEIL的使用方法 (27) 解析SQL语句中INSERT语句的另一种写法 (29) 轻松解决“每个Y的最新X”的SQL问题 (29) 教你快速掌握编写高效SQL语句的方法 (30) 个人经验总结:有关SQL语句的优化技术(1) (30) 用SQL语句删除重复记录的四种好方法 (32) 不要在SQL Server中盲目地追求一句处理(1) (35) 用人工智能技术自动对SQL语句进行重写(1) (38)

ORACLE关于动态SQL的使用

关于动态SQL的使用-----摘录 内容摘要:在PL/SQL开发过程中,使用SQL,PL/SQL可以实现大部份的需求,但是在某些特殊的情况下,在PL/SQL中使用标准的SQL语句或DML语句不能实现自己的需求,比如需要动态建表或某个不确定的操作需要动态执行。这就需要使用动态SQL来实现。本文通过几个实例来详细的讲解动态SQL的使用。 本文适宜读者范围:Oracle初级,中级 系统环境: OS:windows2000Professional(英文版) Oracle:8.1.7.1.0 正文: 一般的PL/SQL程序设计中,在DML和事务控制的语句中可以直接使用SQL,但是DDL语句及系统控制语句却不能在PL/SQL中直接使用,要想实现在PL/SQL中使用DDL语句及系统控制语句,可以通过使用动态SQL来实现。 首先我们应该了解什么是动态SQL,在Oracle数据库开发PL/SQL块中我们使用的SQL分为:静态SQL语句和动态SQL语句。所谓静态SQL指在PL/SQL块中使用的SQL语句在编译时是明确的,执行的是确定对象。而动态SQL是指在PL/SQL块编译时SQL语句是不确定的,如根据用户输入的参数的不同而执行不同的操作。编译程序对动态语句部分不进行处理,只是在程序运行时动态地创建语句、对语句进行语法分析并执行该语句。 Oracle中动态SQL可以通过本地动态SQL来执行,也可以通过DBMS_SQL包来执行。下面就这两种情况分别进行说明: 一、本地动态SQL 本地动态SQL是使用EXECUTE IMMEDIATE语句来实现的。 1、本地动态SQL执行DDL语句: 需求:根据用户输入的表名及字段名等参数动态建表。 create or replace procedure proc_test ( table_name in varchar2,--表名 field1in varchar2,--字段名 datatype1in varchar2,--字段类型 field2in varchar2,--字段名 datatype2in varchar2--字段类型 )as str_sql varchar2(500); begin str_sql:=create table||table_name||(||field1||||datatype1||,||field2|| ||datatype2||); execute immediate str_sql;--动态执行DDL语句 exception when others then null; end; 以上是编译通过的存储过程代码。下面执行存储过程动态建表。

MyBatis学习 之三动态SQL语句

MyBatis学习之三动态SQL语句 三、动态SQL语句 MyBatis学习之一、MyBatis简介与配置MyBatis+Spring+MySql MyBatis学习之二、SQL语句映射文件(1)resultMap MyBatis学习之二、SQL语句映射文件(2)增删改查、参数、缓存 MyBatis学习之三、动态SQL语句 MyBatis学习之四、MyBatis配置文件 有些时候,sql语句where条件中,需要一些安全判断,例如按某一条件查询时如果传入的参数是空,此时查询出的结果很可能是空的,也许我们需要参数为空时,是查出全部的信息。使用Oracle的序列、mysql的函数生成Id。这时我们可以使用动态sql。 下文均采用mysql语法和函数(例如字符串链接函数CONCAT)。 3.1 selectKey 标签 在insert语句中,在Oracle经常使用序列、在MySQL中使用函数来自动生成插入表的主键,而且需要方法能返回这个生成主键。使用myBatis的selectKey标签可以实现这个效果。 下面例子,使用mysql数据库自定义函数nextval('student'),用来生成一个key,并把他设置到传入的实体类中的studentId属性上。所以在执行完此方法后,边可以通过这个实体类获取生成的key。 select nextval('student') INSERT INTO STUDENT_TBL(STUDENT_ID, STUDENT_NAME, STUDENT_SEX, STUDENT_BIRTHDAY, STUDENT_PHOTO, CLASS_ID, PLACE_ID) V ALUES (#{studentId}, #{studentName}, #{studentSex}, #{studentBirthday}, #{studentPhoto, javaType=byte[], jdbcType=BLOB, typeHandler=org.apache.ibatis.type.BlobTypeHandler}, #{classId}, #{placeId}) 调用接口方法,和获取自动生成key StudentEntity entity = new StudentEntity(); entity.setStudentName("黎明你好"); entity.setStudentSex(1); entity.setStudentBirthday(DateUtil.parse("1985-05-28")); entity.setClassId("20000001"); entity.setPlaceId("70000001"); this.dynamicSqlMapper.createStudentAutoKey(entity); System.out.println("新增学生ID: " + entity.getStudentId()); selectKey语句属性配置细节: 属性描述取值keyProper ty selectKey 语句生成结果需要设置的属性。 resultTyp e 生成结果类型,MyBatis 允许使用基本的数据类型,包括String 、int 类型。 order 1:BEFORE,会先选择主键,然后设置keyProperty,再执行insert 语句; 2:AFTER,就先运行insert 语句再运行selectKey 语句。 BEFORE AFTER

Oracle过程中执行动态SQL或DDL语句

如果你用的是Oracle8i 及以上的版本,那简单,在过程中用 execute immediate sql_str 就行, sql_str 是一个拼凑的 SQL 语句,但这个动态语句中带参数,或 Select 的结果要 into 到变量中时就要稍加留心一下了。而在 8i 以前的版本(谁还用这么古老的玩艺,总有些不得已的地方,老系统考虑升级成本遗留下来的,应用软件所伴随着的等),都没法用 execute immediate,就得使用 DBMS_SQL 包来实现了 何谓动态 SQL 和 DDL 语句呢?通常在过程中要操作的表名、字段名都必须是明确的,否则编译过程时就要报错,但如果这两者也用变量名来表示就是动态的。DDL 就是数据库对象定义的操作,如 CREATE TABLE/VIEW/INDEX/SYN/CLUSTER……,及这些对象的删除、修改操作等等。 比如在Oracle中有执行下面过程块的意图时,就要使用到 execute immediate 或是DBMS_SQL 包了。当然下面的语句块是通不过的。 declare col_name varchar2(30) := 'name'; --假定表user存在name字段 col_val varchar2(30); begin select col_name into col_val --按照惯常思维,可能就会这么写 from user where age between 18 and 25; --编译时会提示列名不存在的 drop table t2; --不能直接执行 DDL 语句,后面查询 t2 编译器就无能为力了 end; 现在我们提出对上面问题的解,针对第一个 Select 语句来说明,并假设查询中还带有参数。块中的 DDL 也是类似的解法。例子因力图涵盖更多内容,所以稍显复杂,如果不需要 into (如 update/delete 语句),或者不带参数,会简单多了,应不难简化。有两种处理方法,以 8i 为分水岭。 1. Oracle 8i 及以上版本的过程中处理动态 SQL 语句的办法 declare

在PB中动态修改SQL语句

在PB中动态修改SQL语句 数据库应用程序通常进行一项确定的工作,在编写和编译时就可以确定完整的SQL语句,但是在编译时不能确定SQL语句的具体格式和参数时,只能在程序运行过程中构造SQL语句,需要使用动态SQL语句。以Format 4 动态SQL语句为例,使用格式如下: DECLARE Cursor | Procedure DYNAMIC CURSOR | PROCEDURE FOR DynamicStagingArea ; PREPARE DynamicStagingArea FROM SQLStatement {USING TransactionObject} ; DESCRIBE DynamicStagingArea INTO DynamicDescriptionArea ; OPEN DYNAMIC Cursor | Procedure USING DESCRIPTOR DynamicDescriptionArea} ; EXECUTE DYNAMIC Cursor | Procedure USING DESCRIPTOR DynamicDescriptionArea ; FETCH Cursor | Procedure USING DESCRIPTOR DynamicDescriptionArea ; CLOSE Cursor | Procedure ; ---- 在使用动态SQL语句时,需准备DynamicStagingArea对象(全局对象SQLSA)和DynamicDescriptionArea对象(全局对象SQLDA)。定义游标或过程,读取PREPARE语句中的SQL语句以及语句中说明的参数和类型,执行FETCH语句后,调用相关的函数逐条读取并处理检索结果。 ---- 动态SQL语句虽然解能够在程序运行过程中构造SQL语句,但在实际应用中较少使用。若SELECT语句的结果序列一定,可以通过重新指定DataWindow对象的SELECT语句的方法,达到动态修改SQL语句的功能。运用时首先用Describe函数读取DataWindow对象的SELECT 语句,用Replace等函数修改出符合要求的SELECT语句,并且可以增加检索条件,再用SetSQLSelect函数为DataWindow控件指定修改后的SELECT语句。 ---- 程序代码: string sql_string,sql_new long start_pos=1 string old_str //select语句中需要替换的字符串

动态sql、静态sql、package

学了ORACLE的人,如果去理解DB2的动态和静态,简直要发狂. 在ORACLE中,select * from table where id=1, 这便是静态 下面便是动态: declare b varchar(100) b :='select * from table where id=:1' execute immediate b using 1 一看就知道,所谓的静态是一开始就知道SQL是什么,动态是开始不知道的,只有在执行的时候,execute immediate才知道原来where id=1. 但是在DB2,这种概念完全改变. select * from table where id=1 是什么态?好像是静态,其实在DB2中这是动态SQL. 如果上面这个SQL都是动态,那何为静态呢? 放开一点思维,在DB2中,所谓的动态,是指在执行的时候才编译. 比如你输入select * from table where id=1到cli中,SQL开始执行,自然就要编译。这便是DB2中的动态概念.和SQL 没有任何关系,只和编译有关系. 那么静态是什么,问到这个问题,自然有很多人会问什么是bind一个道理. 因为没有理解静态,所以无法理解BIND. 静态是指,SQL之前就编译好了. 已经生成了计划,这便引出了DB2 package的概念, package 便是存放了计划的东东. 总之package放了SQL执行一些必要条件. 这东西便是bind产生的. 搜索一下google就知道,解释DB2的静态和动态,大部分是这么说的,动态是执行的时候编译的,需要perpare, 静态是指预先编译,生成了package. DB2中有Package的概念,它是存储了你在相应的应用中使用的SQL语句的数据访问计划(Access Plan) 今天所做的程序最后封版,封版前觉得程序有一个地方让我很不爽,于是就进行了一下修改,改动其实很小,只是在if里面增加了一个判断条件,结果程序运行的时候开始报数据库系统错误,错误内容如下: [DB2/NT] SQL0805N 找不到程序包"NULLID.SYSLH203 0X5359534C564C3031"。SQL STATE=51002

PowerBuilder动态SQL语句及在组合查询中的应用.

PowerBuilder不仅支持在PowerScript中使用标准嵌入SQL语句,而且支持使用动态SQL语句。动态SQL语句可以解决嵌入SQL语句不支持DDL语句的问题,还能够在运行时构成SQL语句以解决在编译时不知道语句的具体格式或参数的问题。作者在“抚顺机动车辆管理信息系统”的开发过程中,对动态SQL语句的使用有了深刻的体会,车辆信息项目繁多而且组合条件复杂多变,使用该语句,不仅查询速度较高而且使用灵活可靠。下面就各动态SQL语句的使用格式、方法及各自的特点给予简单介绍,然后以查找车辆为例介绍动态SQL语句(格式4)在组合查询中的应用。 一、态SQL语句格式 PowerBuilder 有四种动态SQL格式,每种格式用于处理编译过程中的不同情况。 格式1:既没有输入参数,也没有输出结果集 格式2:有输入参数,但没有输出结果集 格式3:输入参数和结果集的列已知 格式4:输入参数和结果集在编译时有一个或都未知 1.动态SQL语句格式 格式 EXECUTE IMMEDIATE SQLStatement {USING TransactionObject} ; 参数描述 SQLStatement 是包括一条有效SQL语句的字符串。该字符串可以是常量或者冒号后面跟PowerBuilder变量(如:mysql)。该字符串必须只包括在一行上,且不能包含表达式。 TransactionObject(可选项)数据库的事务对象名 执行这种格式的SQL语句没有结果集、也不需要输入参数。这种格式可用来执行所有形式的数据定义语言(DDL)。 以下是一段建立车辆临时视图的例子: string sql sql=“CREATE VIEW temp_vehicle AS SELECT code , master FROM vehicle ” EXECUTE IMMEDIATE :sql USING SQLDA; 2. 动态SQL语句格式 格式 PREPARE DynamicStagingArea FROM SQLStatement {USING TransactionObject} ; EXECUTE DynamicStagingArea USING {ParameterList} ; 参数描述 DynamicStagingArea DynamicStagingArea变量名(通常为SQLSA) SQLStatement包含一条有效SQL语句的字符串。该字符串可以是常量或者冒号后面跟 PowerBuilder 变量(如:mysql)。在该语句中每个参数键入问号(?)。 TransactionObject(可选项)定义数据库的事务对象名 ParameterList (可选项)用冒号分隔的PowerScript变量列表以下是一段使用格式2的脚本: int id = 156 //车辆ID

MyBatis动态Sql语句

MyBatis动态Sql语句 MyBatis中对数据库的操作,有时要带一些条件,因此动态SQL语句非常有必要,下面就主要来讲讲几个常用的动态SQL语句的语法 MyBatis中用于实现动态SQL的元素主要有: if choose(when,otherwise) trim where set foreach 1、if 对属性进行判断,如果不为空则执行判断条件 [html] view plain copy 来看看结果: 这是从web页面输入的参数 这是输出的结果 这是打印出来的Sql语句 从结果可以看出,只有在条件不为空的时候,属性才会赋值。 2、where 当where中的条件使用的if标签较多时,这样的组合可能会导致错误。我们以在1中的查

sql 动态语句

sql 动态语句 1 :普通SQL语句可以用Exec执行例: Select * from tableName Exec('select * from tableName') Exec sp_executesql N'select * from tableName' -- 请注意字符串前一定要加N 2:字段名,表名,数据库名之类作为变量时,必须用动态SQL 错误: declare @fname varchar(20) set @fname = 'FiledName' Select @fname from tableName -- 错误,不会提示错误,但结果为固定值FiledName,并非所要。正确: Exec('select ' + @fname + ' from tableName') -- 请注意加号前后的单引号的边上加空格 当然将字符串改成变量的形式也可 declare @fname varchar(20) set @fname = 'FiledName' --设置字段名 declare @s varchar(1000) set @s = 'select ' + @fname + ' from tableName' Exec(@s) -- 成功 exec sp_executesql @s -- 此句会报错 --注:@s参数必须为ntext或nchar或nvarchar类型,必须将declare @svarchar(1000) 改为declare @s Nvarchar(1000) 如下: declare @s Nvarchar(1000) -- 注意此处改为nvarchar(1000) set @fname = 'FiledName' --设置字段名 set @s = 'select ' + @fname + ' from tableName' Exec(@s) -- 成功 exec sp_executesql @s -- 此句正确 3. 输入或输出参数 (1)输入参数: declare @QueryString nvarchar(1000) --动态查询语句变量(注:必须为ntext或nchar哐nvarchar 类型,不能是varchar类型) declare @paramstring nvarchar(200) --设置动态语句中的参数的字符串(注:必须为ntext或nchar哐nvarchar类型,不能是varchar类型) declare @input_id int--定义需传入动态语句的参数的值 set @QueryString='select * from tablename where id=@id' --id为字段名,@id为要传入的参数set @paramstring='@id int' --设置动态语句中参数的定义的字符串 set @input_id =1 --设置需传入动态语句的参数的值为1 exec sp_executesql @querystring,@paramstring,@id=@input_id 若有多个参数: declare @QueryString nvarchar(1000) --动态查询语句变量(注:必须为 ntext或nchar哐nvarchar类型,不能是varchar类型) declare @paramstring nvarchar(200) --设置动态语句中的参数的字符串

动态SQL语法

动态SQL语法 1 :普通SQL语句可以用Exec执行例: Select * from tableName Exec('select * from tableName') Exec sp_executesql N'select * from tableName' -- 请注意字符串前一定要加N 2:字段名,表名,数据库名之类作为变量时,必须用动态SQL 错误: declare @fname varchar(20) set @fname = 'FiledName' Select @fname from tableName -- 错误,不会提示错误,但结果为固定值FiledName,并非所要。 正确: Exec('select ' + @fname + ' from tableName') -- 请注意加号前后的单引号的边上加空格 当然将字符串改成变量的形式也可 declare @fname varchar(20) set @fname = 'FiledName' --设置字段名 declare @s varchar(1000) set @s = 'select ' + @fname + ' from tableName' Exec(@s) -- 成功 exec sp_executesql @s -- 此句会报错 --注:@s参数必须为ntext或nchar或nvarchar类型,必须将declare @s varchar(1000) 改为declare @s Nvarchar(1000) 如下: declare @s Nvarchar(1000) -- 注意此处改为nvarchar(1000) set @fname = 'FiledName' --设置字段名 set @s = 'select ' + @fname + ' from tableName' Exec(@s) -- 成功 exec sp_executesql @s -- 此句正确 3. 输入或输出参数 (1)输入参数: declare @QueryString nvarchar(1000) --动态查询语句变量(注:必须为ntext或nchar哐nvarchar类型,不能是varchar类型) declare @paramstring nvarchar(200) --设置动态语句中的参数的字符串(注:必须为ntext或nchar哐nvarchar类型,不能是varchar类型)

动态SQL 并且把返回的值赋给变量

动态SQL 并且把返回的值赋给变量 注意加粗部分,sp_executesql的参数必须为UNICODE,即 NCHAR,NVARCHAR,NTEXT型,否则报错 动态sql语句基本语法 1 :普通SQL语句可以用Exec执行 Select * from tableName Exec('select * from tableName') Exec sp_executesqlN'select * from tableName' -- 请注意字符串前一定要加N 2:字段名,表名,数据库名之类作为变量时,必须用动态SQL eg: declare @fnamevarchar(20) set @fname = 'FiledName' Select @fname from tableName -- 错误,不会提示错误,但结果为固定值FiledName,并非所要。 Exec('select ' + @fname + ' from tableName') -- 请注意加号前后的单引号的边上加空格

当然将字符串改成变量的形式也可 declare @fnamevarchar(20) set @fname = 'FiledName' --设置字段名 declare @s varchar(1000) set @s = 'select ' + @fname + ' from tableName' Exec(@s) -- 成功 exec sp_executesql @s -- 此句会报错 declare @s Nvarchar(1000) -- 注意此处改为nvarchar(1000) set @s = 'select ' + @fname + ' from tableName' Exec(@s) -- 成功 exec sp_executesql @s -- 此句正确 3. 输出参数 declare @numint, @sqlsnvarchar(4000) set @sqls='select count(*) from tableName' exec(@sqls) --如何将exec执行结果放入变量中? declare @numint, @sqlsnvarchar(4000) set @sqls='select @a=count(*) from tableName ' exec sp_executesql @sqls,N'@aint output',@num output select @num 如果是自己的存储过程中有参数,也可以不用sp_executesql,直接

动态SQL语句

动态SQL语句 我们经常使用的SQL语句大多都是静态的,也就是说,SQL语句的结构是固定的,当编译Script时,整个SQL语句都是已知的,它们不能在运行时动态的改变。但是,在很多情况下,SQL语句或SQL所带的参数在编译时并不知道,应用必须在运行时才能生成SQL语句。这种在运行时才能生成的SQL语句叫动态SQL语句。动态SQL允许应用程序向数据库发送任何查询。此外,某些类型的操作,尤其是数据定义语言(DDL)的语句如CREATE和DROP等,对嵌入式SQL根本就不可能。动态SQL使得可以象发送查询一样向数据库发送DDL 和数据存取语言(Date Access Language)的语句。 如果在预编译时下列信息不能确认,就必须使用动态SQL技术,如: 1)SQL语句正文 2)主变量个数 3)主变量的数据类型 4)SQL语句中引用的数据库对象(例如列、索引、基本表、视图等) 动态SQL方法允许在程序运行过程中临时“组装”SQL语句,主要有三种形式: 1)语句可变:允许用户在程序运行时临时输入完整的SQL语句。 2)条件可变:对于查询语句,Select子句是确认的,即语句的输出是确定的,其他子句(如Where子句、Having短语)有一定的可变性。 3)数据库对象,查询条件均可变:对于查询语句,Select子句的列名、From 子句中的表名或视图名、Where子句和Having短语中的条件均可由用户临时构造,即语句的输入和输出可能都是不确定的。 1动态SQL执行方法 在SQL Server中有两种方法执行动态SQL语句,一是使用Sp_Executesql 系统存储过程,二是使用EXECUTE()。有时这两种方法产生同样的结果,不过在其如何运行上却有着一些不同点。 1.1普通SQL语句可以用Exec执行 Select*From TableName Exec('Select*From TableName') Exec Sp_Executesql N'Select*From TableName'--请注意字符串前一定要加N 数据库名之类作为变量时,,必须用动态SQL 表名、、数据库名之类作为变量时 字段名、、表名 1.2字段名 Declare@fname Varchar(20) Set@fname='FiledName' --Select@fname From TableName --错误,不会提示错误,但结果为固定值FiledName,并非所要。 Exec('Select'+@fname+'From TableName') --请注意加号前后的单引号的边上加空格

动态SQL支持所有的SQL类型

动态SQL支持所有的SQL类型。所以,定义变量和绑定变量都可以是集合、LOB,对象类型实例和引用。作为一项规则,动态SQL是不支持PL/SQL特有的类型的。这样,它就不能使用布尔型或索引表。 我们可以重复为绑定变量指定新值执行动态SQL语句。但是,每次都会消耗很多资源,因为EXECUTE IMMEDIATE在每次执行之前都需要对动态字符串进行预处理。 1、动态SQL实例 下面的PL/SQL块包含了几个动态SQL的例子: DECLARE sql_stmt VARCHAR2(200); plsql_block VARCHAR2(500); emp_id NUMBER(4) := 7566; salary NUMBER(7, 2); dept_id NUMBER(2) := 50; dept_name VARCHAR2(14) := 'PERSONNEL'; LOCATION VARCHAR2(13) := 'DALLAS'; emp_rec emp%ROWTYPE; BEGIN EXECUTE IMMEDIATE 'CREATE TABLE bonus (id NUMBER, amt NUMBER)'; sql_stmt := 'INSERT INTO dept VALUES (:1, :2, :3)'; EXECUTE IMMEDIATE sql_stmt USING dept_id, dept_name, LOCATION; sql_stmt := 'SELECT * FROM emp WHERE empno = :id'; EXECUTE IMMEDIATE sql_stmt INTO emp_rec USING emp_id; plsql_block := 'BEGIN emp_pkg.raise_salary(:id, :amt); END;'; EXECUTE IMMEDIATE plsql_block USING 7788, 500; sql_stmt := 'UPDATE emp SET sal = 2000 WHERE empno = :1 RETURNING sal INTO :2'; EXECUTE IMMEDIATE sql_stmt USING emp_id

存储过程中执行动态Sql语句

存储过程中执行动态Sql语句 MSSQL为我们提供了两种动态执行SQL语句的命令,分别是EXEC和sp_executesql; 通常,sp_executesql则更具有优势,它提供了输入输出接口,而EXEC没有。还有一个最大的 好处就是利用sp_executesql,能够重用执行计划,这就大大提供了执行性能,还可以编写更 安全的代码。EXEC在某些情况下会更灵活。除非您有令人信服的理由使用EXEC,否侧尽量使 用sp_executesql. 1.EXEC的使用 EXEC命令有两种用法,一种是执行一个存储过程,另一种是执行一个动态的批处理。以下所讲的都是第二种用法。 下面先使用EXEC演示一个例子,代码1 代码 DECLARE @TableName VARCHAR(50),@Sql NVARCHAR (MAX),@OrderID INT; SET @TableName = 'Orders'; SET @OrderID = 10251; SET @sql = 'SELECT * FROM '+QUOTENAME(@TableName) +'WHERE OrderID = '+ CAST(@OrderID AS VARCHAR(10))+' ORDER BY ORDERID DESC' EXEC(@sql); 注:这里的EXEC括号中只允许包含一个字符串变量,但是可以串联多个变量,如果我们这样 写EXEC: EXEC('SELECT TOP('+ CAST(@TopCount AS VARCHAR(10)) +')* FROM '+ QUOTENAME(@TableName) +' ORDER BY ORDERID DESC'); SQL编译器就会报错,编译不通过,而如果我们这样: EXEC(@sql+@sql2+@sql3); 编译器就会通过; 所以最佳的做法是把代码构造到一个变量中,然后再把该变量作为EXEC命令的输入参数,这样就不会受限制了。

PLSQL开发中动态SQL的使用方法

PL/SQL开发中动态SQL的使用方法 ·2005-07-07 09:57:01 ·来源: 天极网 内容摘要:在PL/SQL开发过程中,使用SQL,PL/SQL可以实现大部份的需求,但是在某些特殊的情况下,在PL/SQL中使用标准的SQL语句或DML语句不能实现自己的需求,比如需要动态建表或某个不确定的操作需要动态执行。这就需要使用动态SQL来实现。本文通过几个实例来详细的讲解动态SQL的使用。 本文适宜读者范围:Oracle初级,中级 系统环境: OS:windows 2000 Professional (英文版) Oracle:8.1.7.1.0 正文: 一般的PL/SQL程序设计中,在DML和事务控制的语句中可以直接使用SQL,但是DDL 语句及系统控制语句却不能在PL/SQL中直接使用,要想实现在PL/SQL中使用DDL语句及系统控制语句,可以通过使用动态SQL来实现。 首先我们应该了解什么是动态SQL,在Oracle数据库开发PL/SQL块中我们使用的SQL 分为:静态SQL语句和动态SQL语句。所谓静态SQL指在PL/SQL块中使用的SQL语句在编译时是明确的,执行的是确定对象。而动态SQL是指在PL/SQL块编译时SQL语句是不确定的,如根据用户输入的参数的不同而执行不同的操作。编译程序对动态语句部分不进行处理,只是在程序运行时动态地创建语句、对语句进行语法分析并执行该语句。 Oracle中动态SQL可以通过本地动态SQL来执行,也可以通过DBMS_SQL包来执行。下面就这两种情况分别进行说明: 一、本地动态SQL 本地动态SQL是使用EXECUTE IMMEDIATE语句来实现的。 1、本地动态SQL执行DDL语句: 需求:根据用户输入的表名及字段名等参数动态建表。 create or replace procedure proc_test ( table_name in varchar2, --表名 field1 in varchar2, --字段名

ASP动态网页制作中使用SQL语句的方法

ASP动态网页制作中使用SQL语句的方法https://www.360docs.net/doc/f215318946.html, 更新日期:2007-05-23 08:22 出处:网页教学网作者:收藏本文 1,SELECT 语句 在SQL的世界里,最最基础的操作就是SELECT 语句了。在数据库工具下直接采用SQL的时候很多人都会熟悉下面的操作: 执行以上语句就会创建一个存放其结果的查询。 而在ASP页面文件上,你也可以采用以上的一般语法,不过情况稍微不同,ASP编程的时候,SELECT 语句的内容要作为字符串赋给一个变量: 好了,明白了ASP下SQL“说话”的方式,接下来如法炮制即可,只要满足你的需要,传统的SQL查询模式和条件查询都能派用场。 举例说明,不妨假设你的数据库内有个数据表,名字是Products ,现在你想取出这个表里的全部记录。然后你就编写了下面的代码: 以上代码——SQL语句的作用就是取出表内的全部数据——执行后将会选出数据表内的全 部记录。不过,要是只想从表内取出某个特定列,比如p_name。那就不能用 * 通配符了,这里得键入具体某列的名字,代码如下: 执行以上查询之后Products 表内、p_name 列的内容就会全被选取出来。 2,WHERE子句设置查询条件 举个例子,假如你只打算取出p_name 记录,而且这些记录的名字必须以字母w打头,那么你就要用到下面的WHERE 子句了:

WHERE 关键词的后面跟着用来过滤数据的条件,有了这些条件的帮助,只有满足一定标准的数据才会被查询出来。在以上的例子里,查询的结果只会得到名字以w 打头的p_name 记录。 以上例子中,百分比符号(%)的含义是指示查询返回所有w 字母打头而且后面是任何数据甚至没有数据的记录条目。所以,在执行以上查询的时候, west 和 willow 就会从Produ cts 表内被选取出来并存放在查询里。 就像你看到的那样,只要仔细地设计SELECT 语句,你就可以限制recordset 中返回的信息量,多琢磨琢磨总能满足你的要求。 这些啊还不过是掌握SQL用途刚起步。为了帮助你逐步掌握复杂的SELECT 语句用法,下面就让我们再来看一下关键的标准术语:比较运算符,这些玩意都是你在构筑自己的SELECT 字符串来获得特定数据时要经常用到的。 WHERE子句基础 在开始创建WHERE 子句的时候,最简单的方式是采用标准的比较符号,它们是 < 、 <= 、 > 、 >= 、<> 和 =。显然,你很快就能明白以下代码的含义和具体运行结果: 注意:这里你会注意到,最后一个例句中的数字4周围加了单引号。原因是这样的,在这个例子中的 "4" 是文本类型而非数字类型。 3,比较运算符:LIKE、NOT LIKE和 BETWEEN 比较运算符指定从表内取出数据的内容范围。你可以用它们来创建过滤器以便缩小records et的范围,促使其只保存给定任务下你关心的信息。 你已经在上面取出w打头记录的例子中看到了LIKE的用法。LIKE判定词是一个非常有用的符号。不过,在很多情况下用了它可能会带给你太多的数据,所以在用到它之前最好先开动脑筋多想想自己到底想获得什么数据。假设你想取出5位数字的SKU号码,而且其开头是1结尾是5,那么你可以用下划符(_)代替%符号: 下划符表示任意一个字符。所以在输入“1___5”的情况下,你的搜索就会限制在满足特定模式的5位数范围内了。 假如你想反其道而行之,要找出所有不匹配“1___5”模式的SKU条目。那么你只需要在刚才语句例子中的LIKE前面加上NOT就可以了。

相关主题
相关文档
最新文档