sql
- MySQL支持
单、双、反
引号;SqlServer仅支持单
引号。 - MySQL获取时间
now()
;SqlServer是getdate()
。 - MySQL支持判断主键是否存在,进行插入或更新。INSERT into users (userID,userName,password) VALUES (1,’jmj’,’123’)
ON DUPLICATE KEY
UPDATE userName =‘jmj’, password =123 - MySQL用
limit 0,10
分页,SqlServer用top 10
分页,或selectROW_NUMBER() OVER(order by ${xxx})
as rownumber,判断rownumber>< 。 - MySQL用
SUBSTRING/SUBSTR
截取字符串,SQLServer仅使用SUBSTRING
- MySQL用
Length
取字符串长度,SQLServer用Len
。 - MySQL用
CONCAT
拼接字符串,SqlServer用+/CONCAT
。 - MySQL用DATE_FORMAT(NOW(),’%y%m%d’)格式化日期,SqlServer用CONVERT(VARCHAR(10),GETDATE(),110)格式化日期。
- Mysql用
IFNULL
判空赋值,SqlServer用ISNULL
。MySQL用ISNULL
判空返回Boolean。 - Mysql用
UPPER(UUID())
生成36位id,SqlServer用NEWID()
。 - Mysql用
DATE_ADD(NOW(),INTERVAL -table.a MONTH)
操作时间,SqlServer用DATEADD(MONTH, -table.a, GETDATE())
。
存储过程
- MySQL用
CREATE PROCEDURE P_CYCLEDETAIL(IN CycleBegin datetime,IN CycleEnd datetime)
BEGIN
DECLARE SqlStr LONGTEXT DEFAULT '';
SET @AAA = 'ada';
SET @@autocommit = 1;
END
定义参数:
跟在过程名称后边的是参数变量,IN/OUT/INOUT代表输入/输出/都行;
DECLARE 的定义的是过程变量,只能自己使用;
一个@是会话变量,全部会话内有效(包括子会话);
两个@是全局变量,不能定义只能使用,又称系统变量。
SqlServer用:
ALTER PROCEDURE [dbo].[P_CYCLEDETAIL]
@CycleBegin DATETIME, //参数变量
@CycleEnd DATETIME
AS
Declare @SqlStr nvarchar(max) //局部变量
select @@ERROR //系统变量
BEGIN
END
- MySQL需要用
;
分割语句 - MySQL使用
call P_CYCLEDETAIL(null,null)
执行;SqlServer使用exec dbo.P_CYCLEDETAIL null,null 或者 {call P_CYCLEDETAIL(NULL, NULL)}
。 - MySQL开启事务,在BEGIN 之后:
BEGIN
DECLARE t_error INTEGER DEFAULT 0; //定义是否异常
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET t_error=1; //异常赋值
START TRANSACTION; //开启事务
IF t_error = 1 THEN //判断提交或回滚
ROLLBACK;
ELSE
COMMIT;
END IF; //注意IF语句的写法
END
SqlServer在BEGIN 后:
BEGIN
TRANSACTION //开启事务
IF @@ERROR=0 //直接引用系统变量判断
BEGIN
COMMIT TRANSACTION
END
ELSE
BEGIN
ROLLBACK TRANSACTION
END //注意这里的END
注意END,MySQL是begin end,SqlServer是begin if begin end。
6. MySQL创建临时表
CREATE TEMPORARY TABLE IF NOT EXISTS TAB(
stationname VARCHAR(100),
assertsowner VARCHAR(100),
points INT(11)
);
TRUNCATE TABLE TAB; //清空表
DROP TABLE TAB; //删除表
SqlServer:
select a,b,c INTO #TAB from Table //TAB即为临时表,注意使用时也要带上#
DROP TABLE #TAB
- MySQL使用GROUP_CONCAT()去拼接,SqlServer使用+=即可。
//MySQL
set @SqlStr =
(select
GROUP_CONCAT('max(case assertsowner when ''',assertsowner,''' then points else 0 end) as ''',assertsowner,'''')
from TAB);
//SqlServer
select @SqlStr+=
',max(case assertsowner when '''+assertsowner+''' then points else 0 end) as '''+assertsowner+'''' from #TAB
- 关于执行拼接的sql:
//MySQL
prepare stmt from @SqlStr; //预处理
EXECUTEstmt; //执行
deallocate prepare stmt; //释放
//SqlServer
exec(@SqlStr) //执行
- 以下为查资料,未实验过
- SqlServer有
GO、AS、SET QUOTED_IDENTIFIER ON、SET ANSI_NULLS ON
。 - SqlServer用return,MySQL要用select 0;。
- SqlServer可以用select a=b赋值,MySQL用select a into b。
- SqlServer用update from,MySQL用update a inner join b。
- SqlServer用convert,MySQL用CONVERT/CAST。
- SqlServer有