2025-04-02 16:38:48 +08:00
< ? php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK IT ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006-2012 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: liu21st <liu21st@gmail.com>
// +----------------------------------------------------------------------
namespace think\db\builder ;
use think\db\Builder ;
use think\db\Expression ;
2025-07-07 14:52:56 +08:00
use think\db\Query ;
use think\Exception ;
2025-04-02 16:38:48 +08:00
/**
* Sqlsrv数据库驱动
*/
class Sqlsrv extends Builder
{
protected $selectSql = 'SELECT T1.* FROM (SELECT thinkphp.*, ROW_NUMBER() OVER (%ORDER%) AS ROW_NUMBER FROM (SELECT %DISTINCT% %FIELD% FROM %TABLE%%JOIN%%WHERE%%GROUP%%HAVING%) AS thinkphp) AS T1 %LIMIT%%COMMENT%' ;
protected $selectInsertSql = 'SELECT %DISTINCT% %FIELD% FROM %TABLE%%JOIN%%WHERE%%GROUP%%HAVING%' ;
protected $updateSql = 'UPDATE %TABLE% SET %SET% FROM %TABLE% %JOIN% %WHERE% %LIMIT% %LOCK%%COMMENT%' ;
2025-07-07 14:52:56 +08:00
protected $deleteSql = 'DELETE FROM %TABLE% %USING% FROM %TABLE% %JOIN% %WHERE% %LIMIT% %LOCK%%COMMENT%' ;
2025-04-02 16:38:48 +08:00
protected $insertSql = 'INSERT INTO %TABLE% (%FIELD%) VALUES (%DATA%) %COMMENT%' ;
protected $insertAllSql = 'INSERT INTO %TABLE% (%FIELD%) %DATA% %COMMENT%' ;
/**
* order分析
* @ access protected
2025-07-07 14:52:56 +08:00
* @ param Query $query 查询对象
* @ param mixed $order
2025-04-02 16:38:48 +08:00
* @ return string
*/
2025-07-07 14:52:56 +08:00
protected function parseOrder ( Query $query , $order )
2025-04-02 16:38:48 +08:00
{
if ( empty ( $order )) {
return ' ORDER BY rand()' ;
}
foreach ( $order as $key => $val ) {
if ( $val instanceof Expression ) {
$array [] = $val -> getValue ();
2025-07-07 14:52:56 +08:00
} elseif ( '[rand]' == $val ) {
$array [] = $this -> parseRand ( $query );
} else {
if ( is_numeric ( $key )) {
list ( $key , $sort ) = explode ( ' ' , strpos ( $val , ' ' ) ? $val : $val . ' ' );
2025-04-02 16:38:48 +08:00
} else {
2025-07-07 14:52:56 +08:00
$sort = $val ;
}
if ( preg_match ( '/^[\w\.]+$/' , $key )) {
$sort = strtoupper ( $sort );
$sort = in_array ( $sort , [ 'ASC' , 'DESC' ], true ) ? ' ' . $sort : '' ;
$array [] = $this -> parseKey ( $query , $key , true ) . $sort ;
} else {
throw new Exception ( 'order express error:' . $key );
2025-04-02 16:38:48 +08:00
}
}
}
2025-07-07 14:52:56 +08:00
return empty ( $array ) ? '' : ' ORDER BY ' . implode ( ',' , $array );
2025-04-02 16:38:48 +08:00
}
/**
* 随机排序
* @ access protected
2025-07-07 14:52:56 +08:00
* @ param Query $query 查询对象
2025-04-02 16:38:48 +08:00
* @ return string
*/
2025-07-07 14:52:56 +08:00
protected function parseRand ( Query $query )
2025-04-02 16:38:48 +08:00
{
return 'rand()' ;
}
/**
* 字段和表名处理
2025-07-07 14:52:56 +08:00
* @ access public
* @ param Query $query 查询对象
* @ param mixed $key 字段名
* @ param bool $strict 严格检测
2025-04-02 16:38:48 +08:00
* @ return string
*/
2025-07-07 14:52:56 +08:00
public function parseKey ( Query $query , $key , $strict = false )
2025-04-02 16:38:48 +08:00
{
if ( is_numeric ( $key )) {
return $key ;
} elseif ( $key instanceof Expression ) {
return $key -> getValue ();
}
2025-07-07 14:52:56 +08:00
2025-04-02 16:38:48 +08:00
$key = trim ( $key );
2025-07-07 14:52:56 +08:00
2025-04-02 16:38:48 +08:00
if ( strpos ( $key , '.' ) && ! preg_match ( '/[,\'\"\(\)\[\s]/' , $key )) {
list ( $table , $key ) = explode ( '.' , $key , 2 );
2025-07-07 14:52:56 +08:00
$alias = $query -> getOptions ( 'alias' );
2025-04-02 16:38:48 +08:00
if ( '__TABLE__' == $table ) {
2025-07-07 14:52:56 +08:00
$table = $query -> getOptions ( 'table' );
$table = is_array ( $table ) ? array_shift ( $table ) : $table ;
2025-04-02 16:38:48 +08:00
}
2025-07-07 14:52:56 +08:00
if ( isset ( $alias [ $table ])) {
$table = $alias [ $table ];
2025-04-02 16:38:48 +08:00
}
}
if ( $strict && ! preg_match ( '/^[\w\.\*]+$/' , $key )) {
throw new Exception ( 'not support data:' . $key );
}
2025-07-07 14:52:56 +08:00
if ( '*' != $key && ! preg_match ( '/[,\'\"\*\(\)\[.\s]/' , $key )) {
2025-04-02 16:38:48 +08:00
$key = '[' . $key . ']' ;
}
2025-07-07 14:52:56 +08:00
2025-04-02 16:38:48 +08:00
if ( isset ( $table )) {
$key = '[' . $table . '].' . $key ;
}
2025-07-07 14:52:56 +08:00
2025-04-02 16:38:48 +08:00
return $key ;
}
/**
* limit
* @ access protected
2025-07-07 14:52:56 +08:00
* @ param Query $query 查询对象
* @ param mixed $limit
2025-04-02 16:38:48 +08:00
* @ return string
*/
2025-07-07 14:52:56 +08:00
protected function parseLimit ( Query $query , $limit )
2025-04-02 16:38:48 +08:00
{
if ( empty ( $limit )) {
return '' ;
}
$limit = explode ( ',' , $limit );
2025-07-07 14:52:56 +08:00
2025-04-02 16:38:48 +08:00
if ( count ( $limit ) > 1 ) {
$limitStr = '(T1.ROW_NUMBER BETWEEN ' . $limit [ 0 ] . ' + 1 AND ' . $limit [ 0 ] . ' + ' . $limit [ 1 ] . ')' ;
} else {
$limitStr = '(T1.ROW_NUMBER BETWEEN 1 AND ' . $limit [ 0 ] . " ) " ;
}
2025-07-07 14:52:56 +08:00
2025-04-02 16:38:48 +08:00
return 'WHERE ' . $limitStr ;
}
2025-07-07 14:52:56 +08:00
public function selectInsert ( Query $query , $fields , $table )
2025-04-02 16:38:48 +08:00
{
$this -> selectSql = $this -> selectInsertSql ;
2025-07-07 14:52:56 +08:00
return parent :: selectInsert ( $query , $fields , $table );
2025-04-02 16:38:48 +08:00
}
}