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 ;
/**
* 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 11:31:25 +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 11:31:25 +08:00
* @ param mixed $order
* @ param array $options
2025-04-02 16:38:48 +08:00
* @ return string
*/
2025-07-07 11:31:25 +08:00
protected function parseOrder ( $order , $options = [])
2025-04-02 16:38:48 +08:00
{
if ( empty ( $order )) {
return ' ORDER BY rand()' ;
}
2025-07-07 11:31:25 +08:00
$array = [];
2025-04-02 16:38:48 +08:00
foreach ( $order as $key => $val ) {
if ( $val instanceof Expression ) {
$array [] = $val -> getValue ();
2025-07-07 11:31:25 +08:00
} elseif ( is_numeric ( $key )) {
if ( false === strpos ( $val , '(' )) {
$array [] = $this -> parseKey ( $val , $options );
} elseif ( '[rand]' == $val ) {
$array [] = $this -> parseRand ();
2025-04-02 16:38:48 +08:00
} else {
2025-07-07 11:31:25 +08:00
$array [] = $val ;
2025-04-02 16:38:48 +08:00
}
2025-07-07 11:31:25 +08:00
} else {
$sort = in_array ( strtolower ( trim ( $val )), [ 'asc' , 'desc' ], true ) ? ' ' . $val : '' ;
$array [] = $this -> parseKey ( $key , $options , true ) . ' ' . $sort ;
2025-04-02 16:38:48 +08:00
}
}
2025-07-07 11:31:25 +08:00
return ' ORDER BY ' . implode ( ',' , $array );
2025-04-02 16:38:48 +08:00
}
/**
* 随机排序
* @ access protected
* @ return string
*/
2025-07-07 11:31:25 +08:00
protected function parseRand ()
2025-04-02 16:38:48 +08:00
{
return 'rand()' ;
}
/**
* 字段和表名处理
2025-07-07 11:31:25 +08:00
* @ access protected
* @ param mixed $key
* @ param array $options
2025-04-02 16:38:48 +08:00
* @ return string
*/
2025-07-07 11:31:25 +08:00
protected function parseKey ( $key , $options = [], $strict = false )
2025-04-02 16:38:48 +08:00
{
if ( is_numeric ( $key )) {
return $key ;
} elseif ( $key instanceof Expression ) {
return $key -> getValue ();
}
$key = trim ( $key );
if ( strpos ( $key , '.' ) && ! preg_match ( '/[,\'\"\(\)\[\s]/' , $key )) {
list ( $table , $key ) = explode ( '.' , $key , 2 );
if ( '__TABLE__' == $table ) {
2025-07-07 11:31:25 +08:00
$table = $this -> query -> getTable ();
2025-04-02 16:38:48 +08:00
}
2025-07-07 11:31:25 +08:00
if ( isset ( $options [ 'alias' ][ $table ])) {
$table = $options [ '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 11:31:25 +08:00
if ( '*' != $key && ( $strict || ! preg_match ( '/[,\'\"\*\(\)\[.\s]/' , $key ))) {
2025-04-02 16:38:48 +08:00
$key = '[' . $key . ']' ;
}
if ( isset ( $table )) {
$key = '[' . $table . '].' . $key ;
}
return $key ;
}
/**
* limit
* @ access protected
2025-07-07 11:31:25 +08:00
* @ param mixed $limit
2025-04-02 16:38:48 +08:00
* @ return string
*/
2025-07-07 11:31:25 +08:00
protected function parseLimit ( $limit )
2025-04-02 16:38:48 +08:00
{
if ( empty ( $limit )) {
return '' ;
}
$limit = explode ( ',' , $limit );
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 ] . " ) " ;
}
return 'WHERE ' . $limitStr ;
}
2025-07-07 11:31:25 +08:00
public function selectInsert ( $fields , $table , $options )
2025-04-02 16:38:48 +08:00
{
$this -> selectSql = $this -> selectInsertSql ;
2025-07-07 11:31:25 +08:00
return parent :: selectInsert ( $fields , $table , $options );
2025-04-02 16:38:48 +08:00
}
}