分类 SQLServer 下的文章

php读取ms sql server数据的方法和注意事项

在windows平台,php5.3+读取sql server里面的数据,其实用php_pdo_odbc.dll扩展是最好的选择,SQL语句的兼容性很高,比ms自家出品的sqlsrv(Microsoft Drivers for PHP for SQL Server)扩展强太多了。

一、下面先吐槽一下sqlsrv一些不爽的地方:

1、获取的数据编码默认是UTF-8的,想改为其它编码的数据有点麻烦,虽说它可以设为用系统的编码,但是这里有个很大的问题, 假如你的系统是gbk的,但是获取到的数据有些还是会变为UTF-8的。尽管可以用iconv转换编码,但这个iconv本来就不能转换全部的中文,说不定某些中文就被忽略掉了,不敢用iconv转换成GBK的。

2、某些字段的类型不能自动映射,会出现映射错误,提示数据类型不正确。

3、一些复杂点的SQL语句居然查询不到结果,这个相当无语了,我的SQL语句中出现了中文,居然都返回不了查询结果,不知道是不是编码问题,我也不想测试了。还有个非常奇怪的地方,SQL语句里面用到了ISNULL这个函数,它居然也不执行,取不到任何结果。

总的来说这个东西只能用来处理下英文类的数据,简单点的SQL语句。复杂点的它根本就不行,兼容性太差。

二、用php_pdo_odbc.dll可以很轻松的处理复杂SQL语句及编码问题。当然用pdo_odbc也出现了一点应该注意的问题,不然我也不会在这里吐槽了。读取nvarchar或者nchar字段的数据时,可能会把该字段后面部分的中文给弄成乱码。因为nvarchar字段是按字符存储的,而odbc是按字节读取的,它好像不能处理多字节字符。当它读取到字段长度那么多个字节的时候,后面的字节就被它搞成乱码了,一开始这个问题百思不得其解。有什么办法可以让它不乱码呢,其实你只需要用convert转换一下数据类型为varchar就行了。如:select convert(varchar(两倍的nvarchar字段的长度), nvarchar字段名) from table1。varchar一定要带长度,最好是这个nvarchar字段长度的两倍,这样转换一下后,你获取的数据就不会出现乱码了。

[转]详解SQL Server的两个存储过程:sp_MSforeachtable/sp_MSforeachdb

1.简介:
作为DBA会经常需要检查所有的数据库或用户表,比如:检查所有数据库的容量;看看指定数据库所有用户表的容量,所有表的记录数...,我们一般处理这样的问题都是用游标分别处理处理,比如:在数据库检索效率非常慢时,我们想检查数据库所有的用户表,我们就必须通过写游标来达到要求;如果我们用sp_MSforeachtable就可以非常方便的达到相同的目的:EXEC sp_MSforeachtable @command1="print '?' DBCC CHECKTABLE ('?')"
系统存储过程sp_MSforeachtable和sp_MSforeachdb,是微软提供的两个不公开的存储过程,从mssql6.5开始。存放在SQL Server的MASTER数据库中。可以用来对某个数据库的所有表或某个SQL服务器上的所有数据库进行管理,后面将对此进行详细介绍。

- 阅读剩余部分 -

[转]SQL Server 跨库复制表数据的解决办法

跨库复制表数据,有很多种方法,最常见的是写程序来批量导入数据了,但是这种方法并不是最优方法,今天就用到了一个很犀利的方法,可以完美在 Sql Server 2005 和 Sql Server 2008 中执行!
格式如下:

insert into tableA
SELECT * FROM
OPENDATASOURCE('SQLOLEDB', 'Data Source=127.0.0.1;User ID=sa;Password=sasasa').databaseName.dbo.tableB

- 阅读剩余部分 -

转:MS SQL自定义函数查找相似记录并计算相似度

问题描述:

表结构如下

ShopID    Tag                    TagType
--------------------------------------
1      手抓肉 烤肉 抓饭 拉条子      2
2      烤肉 抓饭 拉条子             2
3      手抓肉 抓饭 拉条子           2
4      手抓肉 烤肉 抓饭             2
5      囊坑肉 大盘鸡 抓饭 拉条子    2
6      拌面 烤肉 抓饭 拉条子        2
7      手抓肉 大盘鸡 抓饭 拉条子    2

需要搜索与提供的Tag内容(如手抓肉 烤肉 抓饭)相似的记录,并按照相似度从高到低排列,其中Tag是以空格分割的,如上的内容就是说Tag包含手抓肉,烤肉,抓饭,而其他数据只要包含其中一条就表示他们相似,包含的越多就表示越相似。

用自定义函数查找记录和计算相似度,查询时按相似度排序,相似度的定义是,与提供的Tag中的一项相符的就加1,以最后的和来表示相似度。

- 阅读剩余部分 -