本文将主要列出MySql与SqlServer不同的地方,且以常用的存储过程的相关内容为主。
1. 标识符限定符
2. 字符串相加
SqlServer |
直接用 + |
MySql |
concat() |
3. isnull()
SqlServer |
isnull() |
MySql |
ifnull() 注意:MySql也有isnull()函数,但意义不一样 |
4. getdate()
SqlServer |
getdate() |
MySql |
now() |
5. newid()
SqlServer |
newid() |
MySql |
uuid() |
6. @@ROWCOUNT
SqlServer |
@@ROWCOUNT |
MySql |
row_count() 注意:MySql的这个函数仅对于update, insert, delete有效 |
7. SCOPE_IDENTITY()
SqlServer |
SCOPE_IDENTITY() |
MySql |
last_insert_id() |
8. if ... else ...
SqlServer |
IF Boolean_expression { sql_statement | statement_block } [ ELSE { sql_statement | statement_block } ] -- 若要定义语句块,请使用控制流关键字 BEGIN 和 END。
|
MySql |
IF search_condition THEN statement_list [ELSEIF search_condition THEN statement_list] ... [ELSE statement_list] END IF
|
注意:对于MySql来说,then, end if是必须的。类似的还有其它的流程控制语句,这里就不一一列出。
9. declare
其实,SqlServer和MySql都有这个语句,用于定义变量,但差别在于:在MySql中,DECLARE仅被用在BEGIN ... END复合语句里,并且必须在复合语句的开头,在任何其它语句之前。这个要求在写游标时,会感觉很BT.
10. 游标的写法
SqlServer |
declare @tempShoppingCart table (ProductId int, Quantity int) insert into @tempShoppingCart (ProductId, Quantity) select ProductId, Quantity from ShoppingCart where UserGuid = @UserGuid
declare @productId int declare @quantity int declare tempCartCursor cursor for select ProductId, Quantity from @tempShoppingCart
open tempCartCursor fetch next from tempCartCursor into @productId, @quantity while @@FETCH_STATUS = 0 begin update Product set SellCount = SellCount + @quantitywhere productId = @productId
fetch next from tempCartCursor into @productId, @quantity end
close tempCartCursor deallocate tempCartCursor
|
MySql |
declare m_done int default 0; declare m_sectionId int; declare m_newsId int;
declare _cursor_SN cursor for select sectionid, newsid from _temp_SN; declare continue handler for not found set m_done = 1;
create temporary table _temp_SN select sectionid, newsid from SectionNews group by sectionid, newsid having count(*) > 1;
open _cursor_SN; while( m_done = 0 ) do fetch _cursor_SN into m_sectionId, m_newsId;
if( m_done = 0 ) then -- 具体的处理逻辑 end if; end while; close _cursor_SN; drop table _temp_SN;
|
注意:为了提高性能,通常在表变量上打开游标,不要直接在数据表上打开游标。
11. 分页的处理
SqlServer |
create procedure GetProductByCategoryId( @CategoryID int, @PageIndex int = 0, @PageSize int = 20, @TotalRecords int output ) as begin declare @ResultTable table ( RowIndex int, ProductID int, ProductName nvarchar(50), CategoryID int, Unit nvarchar(10), UnitPrice money, Quantity int ); insert into @ResultTable select row_number() over (order by ProductID asc) as RowIndex, p.ProductID, p.ProductName, p.CategoryID, p.Unit, p.UnitPrice, p.Quantity from Products as p where CategoryID = @CategoryID; select @TotalRecords = count(*) from @ResultTable; select * from @ResultTable where RowIndex > (@PageSize * @PageIndex) and RowIndex <= (@PageSize * (@PageIndex+1)); end;
当然,SqlServer中并不只有这一种写法,只是这种写法是比较常见而已。
|
MySql |
create procedure GetProductsByCategoryId( in _categoryId int, in _pageIndex int, in _pageSize int, out _totalRecCount int ) begin set @categoryId = _categoryId; set @startRow = _pageIndex * _pageSize; set @pageSize = _pageSize; prepare PageSql from 'select sql_calc_found_rows * from product where categoryId = ? order by ProductId desc limit ?, ?'; execute PageSql using @categoryId, @startRow, @pageSize; deallocate prepare PageSql; set _totalRecCount = found_rows(); end
|
MySql与SqlServer的差别实在太多,以上只是列出了我认为经常在写存储过程中会遇到的一些具体的差别之处。
转载:http://www.cnblogs.com/fish-li/archive/2011/04/05/2006107.html
http://files.cnblogs.com/fish-li/MySQL-Common-function.pdf
- MyBatis排序时使用order by 动态参数时需要注意,用$而不是# 用$传
- MySql 优化之like语句
- c语言把mysql数据库语句和变量封装为一个语句
- sql语句之union与join的区别
- MySQL中一些查看事务和锁情况的常用语句
- mysql sql语句实现隐藏手机号码中间四位
- 有没有什么MYSQL语句可以判断表是否存在并且创建?
- 【JavaScript】JavaScript的对象-对象专门语句
- if-else语句太多了。他们可以成为全球性的吗?
随机推荐
-
bootstrap 中 css 与 javascript 的使用
-
javascript自适应宽度的瀑布流
-
如何将占位符放在struts textfield标记中
-
使用Acrobat的javascript调试器
-
PHP发布请求未识别的索引错误
-
为什么elementFromPoint()在IE 11上的ifram
-
JavaScript - 检测click事件是否触发了D
-
WebKit "拒绝设置不安全的标题'内容长度'
-
关于JavaScript变量声明及其初始化的问题
-
原生js操作dom的笔记整理