PB动态SQL语句

PB动态SQL语句
PowerBuilder的嵌入式SQL语句只能支持一些固定的标准的SQL语句,即在进行程序代码编译处理时这些SQL语句必须是确定的,另外这种方式也不能执行像Creat Table,Creat Database等这些数据库定义的语句(DDL)。

因此这种嵌入式SQL语句在实际应用中有一定的局限性。

为克服这种方式的局限性,可以使用动态SQL语句,这种方式可以完成嵌入式SQL语句无法实现的功能。

如建库、建表这一类的数据库定义语句(DDL);其次,由于动态SQL语句允许在执行时才确定到底要执行怎样的SQL语句,因此使用动态SQL语句可以使程序实现参数化设计,具有很大的灵活性和通用性。

一、动态SQL语句的应用分析 PowerBuilder提供了四种格式的动态SQL语句,每种格式都有自己不同的特点和作用。

(一)第一种格式
当执行没有输入参数并且没有返回结果集的SQL语句时可以使用这种格式,这种格式使用比较简单,其实现的操作也比较少。

1 语法
EXECUTE IMMEDIATE SQLStatement{USING TransactionObject};
其中SQLStatement是要执行的SQL语句,可以直接用引号将要执行的SQL 引起来用,或者用字符串变量的形式提供SQL语句。

通过使用字符串变量可以在具体执行的时候才指定要执行什么样的SQL语句。

TransactionObject是用户所使用的事务对象,缺省为SQLCA。

2 应用实例
①建立一张数据库表(base),SQL语句的表述用引号引起来直接使用。

EXECUTE IMMEDIATE‘CREATE TABLE base(code char(6),name char(30))’USING SQLCA;
②执行对数据库记录的操作,在表base中插入一条记录,SQL语句通过字符串变量传递执行语句。

STRING lsSQL
LsSQL=”INSERT INTO TABLE base VALUES(’320201’,’市中区支行’)”
EXECUTE IMMEDIATE :lsSQL;
(二)第二种格式
当执行带输入参数但没有返回结果集时的SQL语句可以采用第二种格式。

该格式不仅可以动态地指定要执行的SQL语句,同时还可以动态地确定SQL语句所需要的参数值。

1 语法
PREPARE DynamicStagingArea FROM SQLStatement{USING TransactionObject};
EXECUTE DynamicstagingArea{USING Parameterlist};
其中:DynamicstagingArea是PowerBuilder提供的一种数据类型。

PowerBuilder本身提供了一个名字为SQLSA的DynamicstagingArea类型的全局变量,用于保存要执行的动态SQL语句信息。

2 应用实例
删除base表中的满足一定条件的记录。

STRING lsCode
lsCode=”320101”
PREPARE SQLSA FROM“DELETE base WHERE code=?”;
EXECUTE SQLSA USING:lsCode;
(三)第三种格式
当执行有输入参数并且返回结果集的格式在编译时可以确定的SQL语句时可以使用第三种格式。

这种格式语法比较复杂,但要比前面两种功能强,可以返回结果集。

在返回结果时由于不知道满足过滤条件的记录到底有多少条,因此第三种格式通常采用游标的形式。

1 语法
DECLARE cursor DYNAMIC CURSOR FOR DynamicStagingArea;
PREPARE DynamicStagingArea FROM SQLStatement{USING TransactionObject};
OPEN DYNAMIC cursor {USING Parameterlist};
FETCH cursor INTO VariableList;
CLOSE cursor;
其中cursor是用户所定义的游标的名字。

2 应用实例
将表base中的code字段中间两位为”01”的所有记录读取出来并分别进行相应处理。

STRING lsSQL,lsCode,lsName,lsFilter
LsFilter=”01”
LsSQL=”SELECT code,name FROM base WHERE substring(code,3,2)=?”
DECLARE cursor_base DYNAMIC CURSOR FOR SQLSA;
PREPARE SQLSA FROM:lsSQL;
OPEN DYNAMIC cursor_base USING:lsFilter;
FETCH cursor_base INTO:lsCode,:lsName;
DO WHILE SQLCA.SQLCODE=0
∥对满足条件的记录根据要求分别进行处理
FETCH cursor_base INTO:lsCode,:lsName;
LOOP
CLOSE cursor_base;
(四)第四种格式
当执行有输入参数并且返回结果集的格式在编译时无法确定的SQL语句时可以使用第四种格式。

有时候我们执行一些SQL语句时,不仅带有参数而且返回的结果集中有多少个字段,每个字段是什么类型的数据都不确定,这时只能使用第四种格式来实现。

1 语法
PREPARE DynamicStagingArea FROM SQLStatement{USING TransactionObject};
DESCRIB DynamicStagingArea INTO DynamicDescriptionObject;
DECLARE cursor DYNAMIC CURSOR FOR DynamicDescriptionObject;
OPEN DYNAMIC cursor USING DESCRIPTOR DynamicDescriptionObject;
FETCH cursor USING DESCRIPTOR DynamicDescriptionObject;
CLOSE cursor;
其中:DynamicDescriptionObject是PowerBuilder提供的一个数据类型,在PowerBuilder中提供了一个DynamicDescriptionObject类型的全局数据类型SQLDA,用来存放动态SQL语句的输入输出参数。

2 应用实例
将一个表中满足过滤条件的记录的所有字段取出来分别进行处理,表名在程序运行中由字符串变量传递,字段信息是不确定的。

这里我们假设通过字符串变量中传递的表名是base。

STRING lsString,lsSQL,lsTable,lsColumn
INT liInt
DATETIME liTime
LsSQL=”SELECT*FROM base WHERE code like?”
PREPARE SQLSA FROM lsSQL;
DESCRIB SQLSA INTO SQLDA;∥SQLDA中含有输入参数的描述
DECLARE cursor_base DYNAMIC CURSOR FOR SQLSA;
SetDynamicparm(SQLDA,1,”32%”)∥传递参数值
OPEN DYNAMIC cursor_base USING DESCRIPTOR SQLDA;
FETCH cursor_base USING DESCRIPTOR SQLDA;
DO WHILE SALCA.SQLCODE=0
FOR liInt=1 TO SQLDA.NumOutPuts
CHOOSE CASE SQLDA.OutParmType[liInt]
CASE Typestring!
lsString=GetDynamicString(SQLDA,liInt)
∥处理该字符型的字段
CASE TypeDateTime
LsDateTime=GetDynamicDateTime(SQLDA,liInt)
∥处理该日期型的字段
CASE ELSE
∥处理其他类型的字段
END CHOOSE
NEXT
∥将一条记录的所有字段取完后作相应的处理
FETCH cursor_base USING DESCRIPTOR SQLDA;
LOOP
CLOSE cursor_base;
二、结束语
从上面的说明和举例中可以看出动态SQL的特点是功能强,使用灵活,完全可以在程序代码中动态地生成具体要执行的SQL语句,是嵌入式SQL无法比拟的。

当然动态SQL语句在运行速度上可能要比嵌入式SQL语句略慢一点,但随着计算机处理速度的大幅度提高,现在来说这一点已不成什么问题。

因此,使用动态SQL语句仍是一种非常可取的处理方法。

合集下载

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

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

PLSQL开发中动态SQL的使用方法在PL/SQL开发中,动态SQL是一种在程序运行时构建和执行SQL语句的方式。

它允许我们根据特定条件和需求生成不同的SQL语句,以便在运行时动态地执行。

动态SQL的使用方法可以分为以下几个步骤:1.构建动态SQL语句在PL/SQL中,我们可以使用字符串变量来构建动态SQL语句。

通过拼接字符串和使用条件语句,我们可以根据需要生成不同的SQL语句。

例如:```sqlDECLAREsql_stmt VARCHAR2(200);BEGINIF condition1 THENsql_stmt := 'SELECT * FROM table1';ELSEsql_stmt := 'SELECT * FROM table2';ENDIF;END;```2.执行动态SQL语句一旦我们构建了动态SQL语句,可以使用EXECUTEIMMEDIATE语句将其执行。

EXECUTEIMMEDIATE语句可以接受一个字符串参数,该参数包含要执行的SQL语句。

例如:```sqlEXECUTE IMMEDIATE sql_stmt;```3.使用绑定变量为了避免SQL注入攻击和提高性能,我们应该使用绑定变量而不是直接将变量值嵌入到动态SQL语句中。

绑定变量可以通过在动态SQL语句中使用冒号加上变量名称来指定。

然后,我们可以使用USING子句将实际变量值绑定到动态SQL语句中的绑定变量上。

例如:```sqlDECLAREsql_stmt VARCHAR2(200);var1 VARCHAR2(100) := 'value1';BEGINsql_stmt := 'SELECT * FROM table1 WHERE column1 = :val';EXECUTE IMMEDIATE sql_stmt USING var1;END;```4.处理动态SQL的结果当我们执行动态SQL语句后,可以使用SQL%BULK_ROWCOUNT和SQL%ROWCOUNT等特殊的PL/SQL隐式游标变量来获取执行结果。

PB提供了许多维护系统安全性的功能,其中很重要的一点是可采用(精)

PB提供了许多维护系统安全性的功能,其中很重要的一点是可采用(精)

//或设置缺省用户
7
第9章 数据库应用系统开发工具——PB
9.8 系统安全控制
vconnect='alter user '+vusername +' identified by '+vuserpassword +' default role userdefaultrole,'+vrole Execute immediate :vconnect using SQLCA; If SQLCA.sqlcode <>0 THEN Messagebox(“错误”, “没有激活相应的角色”) Disconnect Using SQLCA; Return -1 ELSE Disconnect using sqlca; Connect using sqlca; IF cbx_1.checked=true THEN //修改用户口令
5
第9章 数据库应用系统开发工具——PB
9.8 系统安全控制
SQLCA.LogId=vusername
SQLCA.DBParm=””
CONNECT using SQLCA; IF SQLCA.sqlcode= -1 THEN messagebox(“错误”, “没有连接到数据库系统”) return -1
Messagebox(“错误”, “口令修改不成功”) Return -1 ELSE
Vuserpassword=vusernewpassword
END IF ……
9
第9章 数据库应用系统开发工具——PB
9.8 系统安全控制
“退出”按钮的Clicked的脚本为: lconnect=’SET ROLE none ’ :vconnect using SQLCA;

SQL动态查询语句大全

SQL动态查询语句大全

学习SQL应知道的动态SQL语句基本语法1 、普通SQL语句可以用Exec执行eg: Select * from tableNameExec('select * from tableName')Exec sp_executesql N'select * from tableName' -- 请注意字符串前一定要加N2、字段名,表名,数据库名之类作为变量时,必须用动态SQLeg: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 outputselect @num此外,如果想要在SQL语句字符串中使用单引号'' 可以使用''''SQL Server数据库中经常用到的identity列发布时间:2008.03.24 04:59来源:赛迪网作者:Alice【赛迪网-IT技术报道】SQL Server中,经常会用到Identity标识列,这种自增长的字段操作起来的确是比较方便。

基于PB数据窗口生成SQL语句原理的使用技巧

基于PB数据窗口生成SQL语句原理的使用技巧
Fe S u。 nh
l mw d 一 . s to ( i = w 1 ne R w0 I r )
_
d 一 .e e … …… 、 w 1St m( h
d 一 .e t t u 0- w0pil yN t w 1Ste a s ir ,,r 8 ! — l mS t o n r, Moie! df d) i 此方法 在利用 表格形式 数据 窗 口输入 数 据时, 可以预先增加许多新行, 界面美 观, 用户操 作简便 。
的 操 纵 。
1数据窗 口自动生 成语句原理 有两大 问题在数据 窗 口生成 S L语句之 Q 前 必须被解决 :一是生成什 么样的 S L语句 ; Q 二是 何时 根据什 么条 件生 成不 同种类 的 S L Q 语句。 1l数据窗 E生成何样 S L语句 _ l Q 系统必须首先要知道被更新 的表,更新表 中哪些字段, 什么字段是主键 , 主键被修 改时采 取的方式 ,数据库 中数据与数据窗 口的数据不 致时如何处理 。这些信息可 以在设计状态 时
Ke o d:aa n o ;S t e n; Pw rule y w r s t dw QL s tmet o eb i r d wi a d 引 言
P w rule 因其所具有 的为应用开发人 o eB i r d 员提供方便环境和强大工具的特 点成 为广为应 用的数据库开发工具之 一。由于其 特色的数 据 窗 口技术对底层 S QL语句进行 了封装,一些特 殊 应用不容易由数据 窗口来实现 。充分掌握这 些 生成原理,就能对数据库数据 实现更加灵活

设置。
111Alw U d t : .. l p ae 决定数据 窗口是否允 o s 许 修改数 据库 。 11 al t U dt:决定 被更新 的表 。 .. T be o p ae 2 该 属性决 定生成 的 S QL语句中的表名。 11 p a a l C lmn:决定可 能被更 .3 U dt be o e u s 新 的各列 。列表框 中各项为数据窗 口对象所对 应 的 各 数 据列 。 11 nq e K y C lmns决 定 被更 新 .. U iu e o 4 u () :

PB动态执行SQL

PB动态执行SQL

如何在PB中使用動態SQL語句執行沒有輸入參數並且沒有返回結果集的SQL語句。

1.語法其中SQLStatement是要執行的SQL語句,可以直接用引號將要執行的SQL引起來用,或者用字串變數的形式提供SQL語句。

通過使用字串變數可以在具體執行的時候才指定要執行什麼樣的SQL語句。

TransactionObject是用戶所使用的事務物件,缺省為SQLCA。

3.應用實例①建立一張資料庫表(base),SQL語句的表述用引號引起來直接使用。

②執行對資料庫記錄的操作,在表TEMP_TEST中插入一條記錄,SQL語句通過字串變數傳遞執行語句。

執行帶輸入參數但沒有返回結果集時的SQL語句。

1.語法其中:DynamicstagingArea是PowerBuilder提供的一種資料類型。

PowerBuilder本身提供了一個名字為SQLSA的DynamicstagingArea類型的總體變數,用於保存要執行的動態SQL語句資訊。

4.應用實例刪除TEMP_TEST表中的滿足一定條件的記錄。

執行有輸入參數並且返回結果集的格式在編譯時可以確定的SQL語句。

1.語法其中cursor是用戶所定義的游標的名字。

# 應用實例將表TEMP_TEST中的ID欄位大於1的所有記錄讀取出來並分別進行相應處理。

int li_idstring ls_sql,ls_name,ls_filterls_filter = 1ls_sql="SELECT id,name FROM temp_test WHERE id>?"DECLARE c1 DYNAMIC CURSOR FOR SQLSA;PREPARE SQLSA FROM :ls_sql;OPEN DYNAMIC c1 USING :ls_filter;FETCH c1 INTO :li_id,:ls_name;DO WHILE SQLCA.SQLCODE=0 . //對滿足條件的記錄根據要求分別進行處理 . FETCH c1 INTO :li_id,:ls_name;LOOPCLOSE c1;執行有輸入參數並且返回結果集的格式在編譯時無法確定的SQL語句。

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

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 sqlsql=“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语句的字符串。

PB动态SQL语句

PB动态SQL语句PowerBuilder的嵌入式SQL语句只能支持一些固定的标准的SQL语句,即在进行程序代码编译处理时这些SQL语句必须是确定的,另外这种方式也不能执行像Creat Table,Creat Database等这些数据库定义的语句(DDL)。

因此这种嵌入式SQL语句在实际应用中有一定的局限性。

为克服这种方式的局限性,可以使用动态SQL语句,这种方式可以完成嵌入式SQL语句无法实现的功能。

如建库、建表这一类的数据库定义语句(DDL);其次,由于动态SQL语句允许在执行时才确定到底要执行怎样的SQL语句,因此使用动态SQL语句可以使程序实现参数化设计,具有很大的灵活性和通用性。

一、动态SQL语句的应用分析 PowerBuilder提供了四种格式的动态SQL语句,每种格式都有自己不同的特点和作用。

(一)第一种格式当执行没有输入参数并且没有返回结果集的SQL语句时可以使用这种格式,这种格式使用比较简单,其实现的操作也比较少。

1 语法EXECUTE IMMEDIATE SQLStatement{USING TransactionObject};其中SQLStatement是要执行的SQL语句,可以直接用引号将要执行的SQL 引起来用,或者用字符串变量的形式提供SQL语句。

通过使用字符串变量可以在具体执行的时候才指定要执行什么样的SQL语句。

TransactionObject是用户所使用的事务对象,缺省为SQLCA。

2 应用实例①建立一张数据库表(base),SQL语句的表述用引号引起来直接使用。

EXECUTE IMMEDIATE‘CREATE TABLE base(code char(6),name char(30))’USING SQLCA;②执行对数据库记录的操作,在表base中插入一条记录,SQL语句通过字符串变量传递执行语句。

STRING lsSQLLsSQL=”INSERT INTO TABLE base VALUES(’320201’,’市中区支行’)”EXECUTE IMMEDIATE :lsSQL;(二)第二种格式当执行带输入参数但没有返回结果集时的SQL语句可以采用第二种格式。

PB详细学习笔记

1.当我们在程序中用修改数据库的时候,只要不用commit切程序在运行,我们此时是查看不到数据库中当前操作的数据的,只有commit后,或退出该程序时,才能在数据库中查看到修改后的数据。

a)这是因为修改数据的时候是先有一个缓冲区,此时还没有修改到实际的数据,多以此时没用commit,而用rollback的时候,对缓冲区的修改代码将不被执行;此时就是起到出错数据回滚的操作b)但是,当我们修改了数据没用到commit的时候,而是直接退出程序,此时数据库缓冲区中的修改代码也会被执行,也就是说,只要不用rollback,推车程序时数据也会被更改。

c)所以,当我们某个地方会出错需要数据回滚时,就要在那里进行rollback操作。

2.在数据窗口对象里设置显示值和实际值时,要注意:当输出文档时任然使用的是实际值,显示值值是看的,没有实际意义。

1.在我们第一次装PDM时,装数据库的时候数据库是没有程序的内部用户的,所以一般是建一个空数据库,然后进行初始化,这样数据库就有了2个用户了,然后再将有数据的数据库还原上去,但此时该数据库也是没有用户的,就要给它授权,即映射,此时执行Grant的代码就是映射授权。

a)所以,当没有系统用户时,执行Grant是没有用的。

1.我们在pb中,事件是可以继承的,方法是不能继承的:a)如果子对象中的该方法写了新代码,则调用时是执行新写的代码,如果子对象该方法中什么也没写,则会调用父对象的该方法b)所以,可见继承是可以先执行父的再执行子的,方法是不行的c)这个就叫做多态1.因为标题名字是字段名字加_t,所以,在自定义字段时,设置字段名时不要有“_”.1.一定要注意补丁包升级和数据库升级,补丁包升级是将我们的程序进行升级,而数据库升级是对数据库进行修改操作的升级。

a)二者不是一回事,都要进行操作。

b)我们要区分数据库版本和程序版本,两者要对应才能正常运行。

2.我们调试时用的动态库为PB 文件夹下的动态库,程序运行时用的是Bin目录下的动态库,程序安装时用的也是Bin目录下的动态库,所以要清楚不同环境下的运行要求。

PB动态创建数据窗口

PB动态创建数据窗⼝动态创建数据窗⼝在实际应⽤中,经常需要根据⽤户需求来动态创建数据窗,⼀般⽅法是这样的。

在⼀个window中加⼊⼀个数据窗控件,如dw_new,但是该数据窗没有dataobject,(空⽩的)就可以⽤以下语法来创建:dw_new.create(ls_syntax,ls_error)//创建语法,错误信息ls_syntax可以⽤以下三种⽅法来形成:⼀、动态由sql语法创建://连接到pb的example数据库stringls_sql,ls_syntax,ls_errorls_syntax=''selectfromdepartment''ls_syntax=sqlca.SyntaxFromSQL(ls_sql,''style(type=grid)'',ls_error)iflen(ls_error)>0thenmessagebox(''Error'',''SyntaxFromSQLError:~r''+ls_error)elsedw_new.create(ls_syntax,ls_error)iflen(ls_error)>0thenMessageBox("Error","Createhavetheseerrors:~r"+ls_error)elsedw_new.settransobject(sqlca)dw_new.retrieve()endifendif⼆、由另⼀个数据窗的syntax来创建stringls_syntax,ls_errorls_syntax=dw_test.describe(''datawindow.syntax'')dw_new.create(ls_syntax,ls_error)ifls_error''''thenmessagebox(''CreateError'',ls_error)elsedw_new.settransobject(sqlca)dw_new.retrieve()endif三、读取psr⽂件来创建stringls_syntax,ls_error,ls_retls_ret=char(13)+char(10)//回车键intli_fileNumlongli_lengthli_FileNum=FileOpen("efef.psr",Streammode!,read!,shared!,Replace!)ifli_filenum>0thenFileSeek(li_FileNum,158,FromBeginning!)li_length=fileRead(li_filenum,ls_syntax)endiffileclose(li_filenum)ifli_length=0thenreturnls_syntax="release5;"+ls_ret+ls_syntax//截掉ls_syntax中的数据部分,5.0以"sparse(names="dept_name?)"作为参考位置//6.0以html(作为参考位置longpos1,pos2pos1=pos(ls_syntax,''sparse(names="'',1)pos2=pos(ls_syntax,''"'',pos1+16)ls_syntax=left(ls_syntax,pos1)+mid(ls_syntax,pos1+1,pos2-pos1+1)dw_New.create(ls_syntax,ls_error)ifls_error''''thenmessagebox(''CreateError'',ls_error)elsedw_new.settransobject(sqlca)dw_new.retrieve()endif//pb6,pb7的代码可以参照pb5⾃⼰写,只是⽂件头和数据窗结束标记不同⽽已。

动态SQL语句

动态SQL语句动态SQL语句我们经常使用的SQL语句大多都是静态的,也就是说,SQL语句的结构是固定的,当编译Script时,整个SQL语句都是已知的,它们不能在运行时动态的改变。

但是,在很多情况下,SQL语句或SQL所带的参数在编译时并不知道,应用必须在运行时才能生成SQL语句。

这种在运行时才能生成的SQL语句叫动态SQL语句。

动态SQL允许应用程序向数据库发送任何查询。

此外,某些类型的操作,尤其是数据定义语言(DDL)的语句如CREATE和DROP等,对嵌入式SQL根本就不可能。

动态SQL使得可以象发送查询一样向数据库发送DDL 和数据存取语言(DateAccessLanguage)的语句。

如果在预编译时下列信息不能确认,就必须使用动态SQL技术,如:1)SQL语句正文2)主变量个数3)主变量的数据类型4)SQL语句中引用的数据库对象(例如列、索引、基本表、视图等)动态SQL方法允许在程序运行过程中临时“组装”SQL语句,主要有三种形式:1)语句可变:允许用户在程序运行时临时输入完整的SQL语句。

2)条件可变:对于查询语句,Select子句是确认的,即语句的输出是确定的,其他子句(如Where子句、Having短语)有一定的可变性。

3)数据库对象,查询条件均可变:对于查询语句,Select子句的列名、From子句中的表名或视图名、Where子句和Having短语中的条件均可由用户临时构造,即语句的输入和输出可能都是不确定的。

1动态SQL执行方法在SQLServer中有两种方法执行动态SQL语句,一是使用Sp_Executesql系统存储过程,二是使用EXECUTE()。

有时这两种方法产生同样的结果,不过在其如何运行上却有着一些不同点。

1.1普通SQL语句可以用Exec执行Select*FromTableNameExec('Select*FromT ableName')ExecSp_ExecutesqlN'Select*FromTableName' -- 请注意字符串前一定要加N1.2字段名、表名、数据库名之类作为变量时,必须用动态SQLDeclare@fnameVarchar(20)Set@fname='FiledName'--Select@fnameFromTableName-- 错误,不会提示错误,但结果为固定值FiledName,并非所要。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档