oracle和sqlserver的语法区别.doc
SQL语言支持这一部分概述了TRANSACTSQL和PL/SQL语言语法之间的相同点和不同点,并给出转换策略。要将ORACLEDML语句和PL/SQL程序迁移到SQLSERVER时,请按下列步骤执行1验证所有SELECT、INSERT、UPDATE和DELETE语句的语法是有效的。进行任何必要的修改。2把所有外部联接改为SQL92标准外部联接语法。3用相应SQLSERVER函数替代ORACLE函数。4检查所有的比较运算符。5用“”字符串串联运算符代替“||”字符串串联运算符。6用TRANSACTSQL程序代替PL/SQL程序。7把所有PL/SQL游标改为非游标SELECT语句或TRANSACTSQL游标。8用TRANSACTSQL过程代替PL/SQL过程、函数和包。9把PL/SQL触发器转换为TRANSACTSQL触发器。10使用SETSHOWPLAN语句,优化查询性能。SELECT语句ORACLE和MICROSOFTSQLSERVER使用的SELECT语句语法类似。ORACLEMICROSOFTSQLSERVERSELECT/OPTIMIZER_HINTS/ALL|DISTINCTSELECT_LISTFROM{TABLE_NAME|VIEW_NAME|SELECT_STATEMENT}WHERECLAUSEGROUPBYGROUP_BY_EXPRESSIONHAVINGSEARCH_CONDITIONSTARTWITHUCONNECTBY{UNION|UNIONALL|INTERSECT|MINUS}SELECTUORDERBYCLAUSEFORUPDATESELECTSELECT_LISTINTONEW_TABLE_FROMTABLE_SOURCEWHERESEARCH_CONDITIONGROUPBYALLGROUP_BY_EXPRESSION,UNWITH{CUBE|ROLLUP}HAVINGSEARCH_CONDITIONORDERBYORDER_EXPRESSIONASC|DESCINADDITIONUNIONOPERATORCOMPUTECLAUSEFORBROWSECLAUSEOPTIONCLAUSESQLSERVER不支持ORACLE特定的基于开销的优化程序提示,它必须被删除。建议使用的技术是,使用SQLSERVER基于开销的优化程序。有关详细信息,请参见本章后面的“SQL语句优化”。SQLSERVER不支持ORACLE的STARTWITHUCONNECTBY子句。在SQLSERVER中,可以创建完成相同任务的存储过程替代它。SQLSERVER不支持ORACLE的INTERSECT和MINUS集合运算符。可使用SQLSERVEREXISTS和NOTEXISTS子句,实现相同的结果。在下面示例中,使用INTERSECT运算符,用于查找学生登记的所有课程的代码和名称。注意,EXISTS运算符是如何代替INTERSECT运算符的。返回的数据是相同的。ORACLEMICROSOFTSQLSERVERSELECTCCODE,CNAMEFROMDEPT_ADMINCLASSINTERSECTSELECTCCCODE,CCNAMEFROMSTUDENT_ADMINGRADEG,DEPT_ADMINCLASSCWHERECCCODEGCCODESELECTCCODE,CNAMEFROMDEPT_ADMINCLASSCWHEREEXISTSSELECT X FROMSTUDENT_ADMINGRADEGWHERECCCODEGCCODE在此例中,使用MINUS运算符,查找那些没有任何学生登记的课程。ORACLEMICROSOFTSQLSERVERSELECTCCODE,CNAMEFROMDEPT_ADMINCLASSMINUSSELECTCCCODE,CCNAMEFROMSTUDENT_ADMINGRADEG,DEPT_ADMINCLASSCWHERECCCODEGCCODESELECTCCODE,CNAMEFROMDEPT_ADMINCLASSCWHERENOTEXISTSSELECT X FROMSTUDENT_ADMINGRADEGWHERECCCODEGCCODEINSERT语句ORACLE和MICROSOFTSQLSERVER使用的INSERT语句语法类似。ORACLEMICROSOFTSQLSERVERINSERTINTO{TABLE_NAME|VIEW_NAME|SELECT_STATEMENT}COLUMN_LIST{VALUES_LIST|SELECT_STATEMENT}INSERTINTO{TABLE_NAMEASTABLE_ALIASWITHUN|VIEW_NAMEASTABLE_ALIAS|ROWSET_FUNCTION_LIMITED}{COLUMN_LIST{VALUES{DEFAULT|NULL|EXPRESSION},UN|DERIVED_TABLE|CUTE_STATEMENT}}|DEFAULTVALUESTRANSACTSQL语言支持对表和视图的插入,但不支持对SELECT语句的INSERT操作。如果ORACLE应用程序代码执行对SELECT语句的插入操作,则必须对它进行修改。ORACLEMICROSOFTSQLSERVERINSERTINTOSELECTSSN,CCODE,GRADEFROMGRADUES 111111111 , 1111 ,NULLINSERTINTOGRADESSN,CCODE,GRADUES 111111111 , 1111 ,NULLTRANSACTSQLVALUES_LIST参数提供了SQL92标准关键字DEFAULT,但ORACLE不支持。此关键字指定了,执行插入操作时使用列的默认值。如果指定列的默认值不存在,则插入NULL。如果该列不允许NULL,则返回一个错误消息。如果该列数据类型定义为TIMESTAMP,则插入下一个有序值。标识符列不能使用DEFAULT关键字。要生成下一个序列号,拥有IDENTITY属性的列不能列在COLUMN_LIST或VALUES_CLAUSE中。不需使用DEFAULT关键字,来获取列的默认值。正如在ORACLE中,如果列没有在COLUMN_LIST中引用,并且它有默认值,则默认值存放在列中。这是迁移时可使用的最兼容的方法。一个有用的TRANSACT_SQL选项CUTEPROCEDURE_NAME是,执行一个过程并将其结果用管道输出到目标表或视图中。ORACLE不允许这样做。UPDATE语句因为TRANSACTSQL支持ORACLEUPDATE命令使用的绝大多数语法,所以只需要极少的修改。ORACLEMICROSOFTSQLSERVERUPDATE{TABLE_NAME|VIEW_NAME|SELECT_STATEMENT}SETCOLUMN_NAMES{CONSTANT_VALUE|EXPRESSION|SELECT_STATEMENT|COLUMN_LIST|VARIABLE_LIST{WHERE_STATEMENT}UPDATE{TABLE_NAMEAST