SQL语言支持
这一部分概述了Tra
sactSQL和PLSQL语言语法之间的相同点和不同点,并给出转换策略。要将OracleDML语句和PLSQL程序迁移到SQLServer时,请按下列步骤执行:1验证所有SELECT、INSERT、UPDATE和DELETE语句的语法是有效的。进行任何必要的修改。2把所有外部联接改为SQL92标准外部联接语法。3用相应SQLServer函数替代Oracle函数。4检查所有的比较运算符。5用“”字符串串联运算符代替“”字符串串联运算符。6用Tra
sactSQL程序代替PLSQL程序。7把所有PLSQL游标改为非游标SELECT语句或Tra
sactSQL游标。8用Tra
sactSQL过程代替PLSQL过程、函数和包。9把PLSQL触发器转换为Tra
sactSQL触发器。10使用SETSHOWPLAN语句,优化查询性能。
SELECT语句
Oracle和MicrosoftSQLServer使用的SELECT语句语法类似。
MicrosoftSQLServerSELECTselect_listSELECToptimizer_hi
tsINTO
ew_table_ALLDISTINCTselect_listFROMtable_sourceFROMWHEREsearch_co
ditio
table_
ameview_
ameGROUPBYALLgroup_by_expressio
select_stateme
tU
WHEREclauseWITHCUBEROLLUPGROUPBYgroup_by_expressio
HAVINGsearch_co
ditio
HAVINGsearch_co
ditio
ORDERBYorder_expressio
ASCSTARTWITHUCONNECTBYDESCUNIONUNIONALLINTERSECTI
additio
MINUSSELECTUUNIONOperatorORDERBYclauseCOMPUTEClauseFORUPDATEFORBROWSEClauseOPTIONClause
SQLServer不支持Oracle特定的基于开销的优化程序提示,它必须被删除。建议使用的技术是,使用SQLServer基于开销的优化程序。有关详细信息,请参见本章后面的“SQL语句优化”。
Oracle
fSQLServer不支持Oracle的STARTWITHUCONNECTBY子句。在SQLServer中,可以创建完成相同任务的存储过程替代它。SQLServer不支持Oracle的INTERSECT和MINUS集合运算符。可使用SQLServerEXISTS和NOTEXISTS子句,实现相同的结果。在下面示例中,使用INTERSECT运算符,用于查找学生登记的所有课程的代码和名称。注意,EXISTS运算符是如何代替INTERSECT运算符的。返回的数据是相同的。
OracleSELECTCCODECNAMEFROMDEPT_ADMINCLASSINTERSECTSELECTCCCODECCNAMEFROMSTUDENT_ADMINGRADEGDEPT_ADMINCLASSDEPT_ADMINCLASSCWHERECCCODEGCCODE
MicrosoftSQLServerSELECTCCODECNAMEFROMDEPT_ADMINCLASSCWHEREEXISTSSELECTXFROMSTUDENT_ADMINGRADEGWHERECCCODEGCCODE
在此例中,使用MINUS运算符,查找那些没有任何学生登记的课程。
OracleSELECTCCODECNAMEFROMDEPT_ADMINCLASSMINUSSELECTCCCODECCNAMEFROMSTUDENT_ADMINGRADEGDEPT_ADMINCLASSCWHERECCCODEGCCODE
MicrosoftSQLServerSELECTCCODECNAMEFROMDEPT_ADMINCLASSCWHERENOTEXISTSSELECTXFROMSTUDENT_ADMINr