你是不是想在存储过程的参数中传递一个表名或者在过程体里动态
生成一个SQL语句,你会发现很难办到。看了下面的例子:你以前的问题全解决了
declare @count int
declare @SQL nvarchar(200)
set @SQL = N'select count(*) from sysobjects'
exec sp_executesql @SQL,N'@i int output',@count output
·Oracle提供了两种方法实现这个功能
①程序包DBMS_SQL,执行一个语句的过程:
打开游标(open_cursor,对于非查询语句,无此过程)
分析语句(Parse)
绑定变量(bind_variable)
执行语句(execute)
关闭游标(close_cursor,对于非查询语句,无此过程)
②execute immediate ls_SQL
Oracle用|| 符号作为连接符,而SQL Server的连接符是加号:+ 。
Oracle查询如下所示:
Select ‘Name’ || ‘Last Name’ From tableName
对应的SQL Server查询如下所示:
Select ‘Name’ + ‘Last Name’
数字取舍
Oracle数据库内有一个TRUNC函数,该函数返回m位十进制数的n位;如果省略m则n就是0位。m的值可以为负,表示截去小数点左边m位数字。
在SQL Server下可以用Round或者Floor。
以下是Oracle查询:
SELECT TRUNC(15.79,1) "Truncate" FROM DUAL;
下面是同类查询的SQL Server版本:
SELECT ROUND(15.79, 0) rounded , ROUND(15.79, 0,1) truncated
SELECT FLOOR(ROUND(15.79, 0)), FLOOR(ROUND(15.79, 0,1) )
数字转换
Oracle的TO_CHAR函数可以把n位NUMBER数据类型转换为VARCHAR2 数据类型,同时采用可选的数字格式。
SQL Server则通过STR函数返回数字转换之后的字符数据。不过,该函数不具方便的Format参数。
Oracle查询如下:
SELECT to_char(123.45 ,99999999999999) from tab
SELECT to_char(EXPIRY_DATE,'DDMONYYYY') from tab
以下是SQL Server版本的查询:
SELECT STR(123.45, 14)
SELECT STR(round(123.455 , 2),12,2)
SELECT CAST(REPLACE((CONVERT(varchar(12) , EXPIRYDATE, 106 )),' ' , '') as varchar(9))
LENGTH和LEN
以下是Oracle的查询:
SELECT LENGTH('SQLMAG') "Length in characters" FROM DUAL;
以上查询在SQL Server下是这样写的:
SELECT LEN('SQLMAG') "Length in characters"
日期
以上两种系统都具有各自的当前日期和时间格式。
Oracle取得日期和采用如下方式:
SYSDATE
SQL Server则是这样的:
GETDATE()
你可以用各种语法操作日期。以下的代码对Oracle日期值中的月份进行了格式调整(返回日期再加上n月):
Select add_months(sysdate,12) from dual
SQL Server则是如下完成同等功能的:
Select dateadd(mm,12,getdate())
数据的减法也不同。以下代码在Oracle中直接对数据进行减法操作:
SELECT sysdate -add_months(sysdate,12) FROM dual
SQL Server则是这样做的:
SELECT datediff(dd, GetDate(),dateadd(mm,12,getdate()))
执行查询时
PLSQL执行查询的时候,FROM子句是必须的
而SQL SERVER不一定
如ORACLE中select 2*5 from dual
而SQL SERVER中select 2*5
PL/SQL用";"分割每一 句,T-SQL用回 分割一 句。
PL/SQL和T-SQL的注 方法相同。
if语句
PL/SQL的if 句, vb很 似,最後要用";" 束:
IF
ELSIF
/*... ...*/
ELSIF
ELSE ...
END IF;
T-SQL的if 句
if
/*...*/
end
PL/SQL是以block 元的,所有的PL/SQL均以block 成。T-SQL 有block的概念。 如下:
DECLARE
/* Declarative section: variables, types, and local subprograms. */
BEGIN
/* Executable section: procedural and SQL statements go here. */
/* This is the only section of the block that is required. */
EXCEPTION
/* Exception handling section: error handling statements go here. */
END;
值 句
PL/SQL可以在 量 明中 值:
l_date DATE := to_date('31-JUL-02');
T-SQL要 量 值分割
declare @sDate datetime
set @sDate=getdate()
注意 值符 不一 。PL/SQL是":=", T-SQL是"="
以下是PL/SQL的Declaration section的 值 句示 :
declare
hire date date; /* implicit initialization with null */
job title varchar2(80) := ’Salesman’;
emp found boolean; /* implicit initialization with null */
salary incr constant number(3,2) := 1.5; /* constant */
. . .
begin . . . end;
Boolean data may only be true, false, or null.
PL/SQL的select into vs. T-SQL select into
T-SQL中,例如:
select * from author into temp1 where au_id=8081 -- 自 建立一 temp1