您当前的位置:首页 > 互联网教程

MySQL和SQL Server存储过程写法上的区别

发布时间:2025-05-12 12:29:47    发布人:远客网络

MySQL和SQL Server存储过程写法上的区别

一、MySQL和SQL Server存储过程写法上的区别

1、一、多数指令是相同的,包括创建和修正存储过程的指令。

2、二、很多细微的指令有不同,具体如下(不仅):

3、1 mysql支持enum,和set类型,sql server不支持

4、2 mysql不支持nchar,nvarchar,ntext类型

5、3 mysql的递增语句是AUTO_INCREMENT,而mssql是identity(1,1)

6、MYSQL:create table basic(id int key auto_increment,name varchar(20));

7、 MSSQL: create table basic(id int identity(1,1), name varchar(20))

8、4 msms默认到处表创建语句的默认值表示是((0)),而在mysql里面是不允许带两括号的

9、6 mssql识别符是[],[type]表示他区别于关键字(可选用来包含表名、字段名),但是mysql却是 `(重音符,也就是按键1左边的那个符号)

10、7 mssql支持getdate()方法获取当前时间日期,但是mysql里面可以分日期类型和时间类型,获取当前日期是cur_date(),当前完整时间是 now()函数

11、8 mssql不支持replace into语句,但是在最新的sql20008里面,也支持merge语法

12、9 mysql支持insert into table1 set t1=‘’, t2=‘’,但是mssql不支持这样写

13、10 mysql插入多行支持这样写 insert into tabl1 values(1,1),(1,1),(1,1),(1,1),(1,1),(1,1),(1,1) MSSQL不支持

14、11 mssql不支持limit语句,是非常遗憾的,只能用top取代limt 0,N,row_number() over()函数取代limit N,M

15、12 mysql在创建表时要为每个表指定一个存储引擎类型,而mssql只支持一种存储引擎

16、13 mysql不支持默认值为当前时间的datetime类型(mssql很容易做到),在mysql里面是用timestamp类型

17、14 mssql里面检查是否有这个表再删除,需要这样:

18、 exists(select* from dbo.sysobjects where id=

19、 object_id(N'uc_newpm') and OBJECTPROPERTY(id, N'IsUserTable')

20、但是在mysql里面只需要 DROP TABLE IF EXISTS cdb_forums;

21、15 mysql支持无符号型的整数,那么比不支持无符号型的mssql就能多出一倍的最大数存储

22、16 mysql不支持在mssql里面使用非常方便的varchar(max)类型,这个类型在mssql里面既可做一般数据存储,也可以做blob数据存储

23、 mysql创建非聚集索引只需要在创建表的时候指定为key就行,比如:KEY displayorder(fid,displayorder)

24、在mssql里面必须要:create unique nonclustered index

25、index_uc_protectedmembers_username_appid on dbo.uc_protectedmembers

26、18 mysql text字段类型不允许有默认值

27、19mysql的一个表的总共字段长度不超过65XXX。

28、20一个很表面的区别就是mysql的安装特别简单,而且文件大小才110M(非安装版),相比微软这个庞然大物,安装进度来说简直就是.....

29、21mysql的管理工具有几个比较好的,mysql_front,和官方那个套件,不过都没有SSMS的使用方便,这是mysql很大的一个缺点。

30、22mysql的存储过程只是出现在最新的版本中,稳定性和性能可能不如mssql。

31、23同样的负载压力,mysql要消耗更少的CPU和内存,mssql的确是很耗资源。

32、24php连接mysql和mssql的方式都差不多,只需要将函数的mysql替换成mssql即可。

33、25mysql支持date,time,year类型,mssql到2008才支持date和time。

34、MYsql:变量赋值SELECT@min_price:=MIN(price),@max_price:=MAX(price) FROM shop

35、 MSsql:变量赋值SELECT@min_price=MIN(price),@max_price=MAX(price) FROM shop

36、三、总的来说,如果是简单的存储过程代码,要修改,不会太难。如果是复杂的系统,要移植会很难很难。

二、什么是存储过程有什么优点

存储过程是事先经过编译并存储在数据库中的一段SQL语句的集合,调用存储过程可以简化应用开发人员的很多工作,减少数据在数据库和应用服务器之间的传输,对于提高数据处理的效率是有好处的。

1、重复使用:存储过程可以重复使用,从而可以减少数据库开发人员的工作量。

2、减少网络流量:存储过程位于服务器上,调用的时候只需要传递存储过程的名称以及参数就可以了,因此降低了网络传输的数据量。

3、安全性:参数化的存储过程可以防止SQL注入式攻击,而且可以将Grant、Deny以及Revoke权限应用于存储过程。

1、更改比较繁琐:如果更改范围大到需要对输入存储过程的参数进行更改,或者要更改由其返回的数据,则仍需要更新程序集中的代码以添加参数、更新 GetValue()调用,等等,这时候估计比较繁琐。

2、可移植性差:由于存储过程将应用程序绑定到 SQL Server,因此使用存储过程封装业务逻辑将限制应用程序的可移植性。如果应用程序的可移植性在您的环境中非常重要,则需要将业务逻辑封装在不特定于 RDBMS的中间层中。

参考资料来源:百度百科-存储过程

三、如何用python连接mysql数据库

1、MySQL数据库要用MySQLdb模块,但Python用来链接MySQL的第三方库MySQLdb不支持Python3.x

特别说明:我在我的电脑上实验时,我的python是2.7.2版本,安装对应版本的MySQLdb之后直接可以运行,并与数据库连接成功,所以如果大家也像我一样顺利的话,下面的就不需要看了,直接跳过,看第2点如何执行sql语句即可!如果安装之后出现异常,可以参考一下下面的解决办法。

连接的关键是安装MySQLdb模块要下载与Python相对应的版本:

下载好后安装,它会自动检测到计算机Python的安装路径,并自动填写模块解压路径(我的是:D:\ProgramFiles\ActivePython 2.6.6.17\Lib\site-packages\)。

但解压完成后并不能使用,还要修改MySQLdb模块下的一些文件:

①.在MySQLdb目录下(我的是:D:\ProgramFiles\ActivePython 2.6.6.17\Lib\site-packages\MySQLdb)找到__init__.py:

注释第34、35行的from setsimport ImmutableSet、class DBAPISet(ImmutableSet):,在后面添加class DBAPISet(frozenset):

# from sets import ImmutableSet

# class DBAPISet(ImmutableSet):

注释第37行的from sets import BaseSet, Set,将第45行的return Set([ i for i in s.split(',') ifi ])中的Set改为set;同样将第129行的Set: Set2Str,中的Set改为set(不要修改Set2Str),到这里就修改完毕了

conn=MySQLdb.connect(host="localhost",user="root",passwd="sa",db="mytable")

host:连接的数据库服务器主机名,默认为本地主机(localhost)。

user:数据库登陆名.默认是当前用户.

passwd:数据库登陆的秘密.默认为空.

db:要使用的数据库名.没有默认值.

port:MySQL服务使用的TCP端口.默认是3306.

conn连接有两个重要的方法commit【提交新增和修改】,rollback【撤销新增或修改】

我们要使用连接对象获得一个cursor对象,接下来,我们会使用cursor提供的方法来进行工作.

这些方法包括两大类:1.执行命令,2.接收返回值

callproc(self, procname, args):用来执行存储过程,接收的参数为存储过程名和参数列表,返回值为受影响的行数

execute(self, query, args):执行单条sql语句,接收的参数为sql语句本身和使用的参数列表,返回值为受影响的行数

executemany(self, query, args):执行单挑sql语句,但是重复执行参数列表里的参数,返回值为受影响的行数

nextset(self):移动到下一个结果集

fetchall(self):接收全部的返回结果行.

fetchmany(self, size=None):接收size条返回结果行.如果size的值大于返回的结果行的数量,则会返回cursor.arraysize条数据.

fetchone(self):返回一条结果行.

scroll(self, value, mode='relative'):移动指针到某一行.如果mode='relative',则表示从当前所在行移动value条,如果mode='absolute',则表示从结果集的第一行移动value条.

#使用sql语句,这里要接收的参数都用%s占位符.要注意的是,无论你要插入的数据是什么类型,占位符永远都要用%s

sql="insert into cdinfo values(%s,%s,%s,%s,%s)"

param=(title,singer,imgurl,url,alpha)

cursor.execute("select* from cdinfo")

#我们使用了fetchall这个方法.这样,cds里保存的将会是查询返回的全部结果.每条结果都是一个tuple类型的数据,这些tuple组成了一个tuple

#因为是tuple,所以可以这样使用结果集

#或者直接显示出来,看看结果集的真实样子

#如果需要批量的插入数据,就这样做

sql="insert into cdinfo values(0,%s,%s,%s,%s,%s)"

#每个值的集合为一个tuple,整个参数集组成一个tuple,或者list

param=((title,singer,imgurl,url,alpha),(title2,singer2,imgurl2,url2,alpha2))

#使用executemany方法来批量的插入数据.这真是一个很酷的方法!

n=cursor.executemany(sql,param)

需要注意的是(或者说是我感到奇怪的是),在执行完插入或删除或修改操作后,需要调用一下conn.commit()方法进行提交.这样,数据才会真正保存在数据库中.我不清楚是否是我的mysql设置问题,总之,今天我在一开始使用的时候,如果不用commit,那数据就不会保留在数据库中,但是,数据确实在数据库呆过.因为自动编号进行了累积,而且返回的受影响的行数并不为0.

需要分别的关闭指针对象和连接对象.他们有名字相同的方法

1 Python文件设置编码 utf-8(文件前面加上#encoding=utf-8)

3 Python连接MySQL是加上参数 charset=utf8

4设置Python的默认编码为 utf-8(sys.setdefaultencoding(utf-8)

sys.setdefaultencoding('utf-8')

db=MySQLdb.connect(user='root',charset='utf8')

注:MySQL的配置文件设置也必须配置成utf8

Con= MySQLdb.connect(host='localhost',user='root',passwd='root',db='abc')

sql="insert into【table】(字段,字段) values(值,值)"

sql="update【table】 set字段=‘值’where条件"

sql="delete from【table】where条件"

cur.execute('select* from tables')

其返回值为SQL语句得到的行数,如:2L,表示2行。

然后,可以从该对象的fetchone或fetchall方法得到行信息。

指针对象的fetchone()方法,是每次得到一行的tuple返回值:

>>> row=cur.fetchone()

('user1','52c69e3a57331081823331c4e69d3f2e', 1000L, 1000L,'/home/FTP/user1','')

指针对象的fetchall()方法,可取出指针结果集中的所有行,返回的结果集一个元组(tuples):

>>> cur.scroll(0,'absolute')

>>> row=cur.fetchall()

(('user1','52c69e3a57331081823331c4e69d3f2e', 1000L, 1000L,'/home/FTP/user1',''),('user2','7e58d63b60197ceb55a1c487989a3720', 1000L, 1000L,'/home/FTP/user2', None))

当使用fetchone()方法是,指针是会发生移动的。所以,若不重置指针,那么使用fetchall的信息将只会包含指针后面的行内容。

int:移动的行数,整数;在相对模式下,正数向下移动,负值表示向上移动。

parm:移动的模式,默认是relative,相对模式;可接受absoulte,绝对模式。

修改数据,包括插入、更新、删除。它们都是使用指针对象的execute()方法执行:

cur.execute("insert into table(row1, row2) values('111','222')")

cur.execute("update table set row1='test' where row2='row2'")

cur.execute("delete from table where row1='row1'")

因单引号“'”用于SQL语句中的标识,所以,python中的字符串需使用双引号括住。

此外,也可以使用python的“格式化字符串”写法,简化命令,例如:

cur.execute("update table set row1='%s' where row2='%s'"%('value1','value2'))

※请注意,'%s'的单引号是SQL语句的间隔符,'value1'的单引号是python的字符串间隔符,其含义是不同的。是否需要间隔符,以及使用双引号还是单引号作为间隔,需根据其含义决定。例如,还有:

cur.execute("update FTPUSERS set passwd=%s where userid='%s'"%("md5('123')",'user2'))

这里,paswd=%s是因SQL的md5()函数是不需要单引号间隔的;"md5('123')"是python的字符串中含有单引号,所以用双引号括住。

一般情况下,MySQLdb模块会自动提交修改。但我们在更新数据后,手动运行一次:

需要分别的关闭指针对象和连接对象.他们有名字相同的方法