1、原来属性为"是/否"的字段将被转换成非空的"bit"
所以需要把 字段=true 改成 字段=1
字段=false 改成 字段=0
2、所有的默认值都丢失了。主要是数字类型和日期类型
3、 所有的sql语句中的“now()”必须换成“getdate()”
4、时间查询
access select * from table where time >#2008-1-8# and time <#2008-1-30#
mssql select * from table Where (time BETWEEN '2008-1-8' AND '2008-1-30' )
5、日期函数不相同,在对ACCESS数据库处理中,可用date()、time()等函数,但对
SQL SERVER数据库处理中,只能用datediff,dateadd等函数,而不能用date()、time()等函数。
所有datediff('d', time1, time2)要改成datediff(day, time1, time2)
所有datediff('ww', time1, time2)要改成datediff(week, time1, time2)
所有datediff('d', time1, time2)要改成datediff(day, time1, time2)
6、nvarchar字段求和时
错误提示“sum or average aggregate 运算不能以 nvarchar 数据类型作为参数。”
sum(字段) 改成 sum(cast(字段 as float))
7、在mssql server中,有许多保留字,在access中是没有的,当你把数据导入到mssql的时候,问题就出来了。mssql在导入的时候,会自动给这些字段(包括数据库中的表名)加上“[字段名]”,因此,你必须修改你的脚本,把相应的字段名字(或者表名字)加上中括号,或改变字段名字为不是mssql的保留字
8、追加字符
access: update table set str=str&'abc'
mssql: update table set str=convert(varchar(1000),str)+'abc'
9、日期模糊搜索
将日期转换成字符串后再用like 模糊查询肯定可以的!
10、搜索时用的比较多
access: sql=" instr(1,lcase(字段),lcase("""&value&"""),0) <>0 "
mssql: sql=" charindex(lower('"&value&"'),lower(cast (col as nvarchar(4000) ) ) ) <>0"
—————————————–
那就是数据格式的问题了.
如果你的参数 2005-6-1都是格式化成 2005-06-01, 2005-6格式化成2005-06 这个样子,那么直接
Where CONVERT(VARCHAR(10),dt,120) LIKE @d + '%'即可
如果你的参数全都不补0,即 2005-06-01这样的参数都格式化成 2005-6-1这样的样子,那么
Select * FROM tb Where REPLACE(CONVERT(VARCHAR(10),dt,120),'-0','-') LIKE @d + '%'
即可.
自已先用一种数据格式约定,然后格式化参数,再进行相应处理.
MSSQL数据导入后主键和字段默认值丢失的解决办法
—————-2—————
经过,一个星期努力,终于把BLOG从Access转到了SQL Server 2005。
Access数据库作为一个中小型的单机数据库系统,在承担访问量、数据量大的网站应用时,往往就不堪重负了。一般认为,超过50M的access数据库性能就开始明显下降,超过100M以后,出错、运行慢的问题会更加突出。而我的BLOG数据库已达到了四百多兆,痛定思痛,决定升级为SQL Server 2005。
这其中,走了好些弯路,起初我是直接利用企业管理器把Access导入SQL中,发现SQLl数据库表是没有自动字段的,原来Access中的自动字段被转换成了普通字段,需要手工改成标识类型,增量为1。 所有的时间字段,如果定义了默认值,那么原来是now(),现在需要改成getdate() 。原来字段的默认值都不会自动引入,需要对照原表的字段手工添加。注释在Access项目或SQLServer数据库中,前缀“n”代表“国家/地区”,意思是这个数据类型是启用Unicode的。在Access数据库中,全部文本列在默认情况下都是启用Unicode的。真费了我,好些光景。
如此这般数据库可以调用,程序将就着能运行了,但发现,原来的程序运行起来错误百出。
原来,Access与SQL程序中使用到的SQL查询语句大体差不多,但是有一些微妙的差别,正是这些差别,造成了程序的不通用,一般要修改的部分如下:
(1)时间函数的问题:SQL数据库的时间函数与access不同,最常见的是取现在时间的函数,access是now(),SQL是getdate()。因此凡是在where子句中使用了now()的地方都要改成getdate();注意,now()函数在asp程序本身也要使用,凡是不在数据库查询或执行语句中使用的now()函数千万不要改。
(2)时间比较函数:datediff('d','时间1',‘时间2’)这是access查询用的格式,SQl中这些引号都要去掉,同时时间格式的前后可能加上了#,这也要去掉。同样这也是指在sql语句中的,在asp语句中的要保持原样。
(3)空值的表示:在access中,判断空值一般用是否=""来表示,但是这在SQL中往往出错,如果遇到出错的问题或者程序运行不正常,可以改成如这样判断:where (name is null)
(4)真假值判断:access中可以用=true、=false来判断,但是在SQL中就会出错,因此在SQL查询或执行语句中这类判断要分别改成=1、=0。注意一点:有些程序虽然写成=“true”,但是由于有引号,所以这个字段是字符类型的,你不能改成=1,保持原样即可。
(5)在对ACCESS数据库进行删除纪录时用:"delete * from user where id=10",而对SQL SERVER数据库进行删除是用:"delete user where id=10"。
(6)在对ACCESS数据库处理中,sql语句中直接可以用一些VB的函数,像cstr()函数,而对SQLSERVER数据库处理中,却不能用。
调试程序经常遇到的出错的语句是:conn.execute(sql),注意这句本身是没有错的,错误原因是里面的这个sql字符串,要向上看这个sql字符串是如何生成的,按照上面所说的程序修改办法修改。
未经允许不得转载:Windy's Blog » access转mssql 以后 asp程序的写法区别