当前位置:文档之家› sql 动态语句

sql 动态语句

sql 动态语句
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) --设置动态语句中的参数的字符串

(注:必须为ntext或nchar哐nvarchar类型,不能是varchar类型)

declare @input_id int--定义需传入动态语句的参数的值,参数1

declare @input_name varchar(20)--定义需传入动态语句的参数的值,参数2

set @QueryString='select * from tablename where id=@id and

name=@name' --id与name为字段名,@id与@name为要传入的参数

set @paramstring='@id int,@name varchar(20)' --设置动态语句中参数的定义的字符串,多个参数用","隔开

set @input_id =1 --设置需传入动态语句的参数的值为1

set @input_name='张三' --设置需传入动态语句的参数的值为"张三"

exec sp_executesql

@querystring,@paramstring,@id=@input_id,@name=@input_name--请注意参数的顺序(2)输出参数

declare @num int, @sqls nvarchar(4000)

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

exec(@sqls)

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

declare @QueryString nvarchar(1000) --动态查询语名变量(注:必须为ntext或nchar哐nvarchar 类型,不能是varchar类型)

declare @paramstring nvarchar(200) --设置动态语句中的参数的字符串(注:必须为ntext或nchar哐nvarchar类型,不能是varchar类型)

declare @output_result int--查询结果赋给@output_result

set @QueryString='select @totalcount=count(*) from tablename'

--@totalcount为输出结果参数

set @paramstring='@totalcount int output' --设置动态语句中参数

的定义的字符串,多个参数用","隔开

exec sp_executesql

@querystring,@paramstring,@totalcount=@output_result output

select @output_result

当然,输入与输出参数可以一起使用,大家可以自己去试一试。

另外,动态语句查询的结果集要输出的话,我只想到以下用临时表的方法,不知各位有没有更好的方法.

IF object_id('[tempdb].[dbo].#tmp') IS NOT NULL --判断临时表#tmp是否存在,存在则删除drop table #tmp

select * into #tmp from tablename where 1=2 --创建临时表#tmp,其结构与tablename相同declare @QueryString nvarchar(1000) --动态查询语名变量(注:必须为ntext或nchar哐nvarchar 类型,不能是varchar类型)

set @QueryString='select * from tablename '

insert into #tmp(field1,field2,...) exec(@querystirng)

动态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.doczj.com/doc/8515225324.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.doczj.com/doc/8515225324.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就可以了。

相关主题
文本预览
相关文档 最新文档