QueryBuilder.php 4.81 KB
Newer Older
1 2 3 4 5 6 7 8 9
<?php
/**
 * @link http://www.yiiframework.com/
 * @copyright Copyright (c) 2008 Yii Software LLC
 * @license http://www.yiiframework.com/license/
 */

namespace yii\db\mssql;

resurtm committed
10 11
use yii\base\InvalidParamException;

12
/**
13
 * QueryBuilder is the query builder for MS SQL Server databases (version 2008 and above).
14 15 16 17 18 19 20 21 22
 *
 * @author Timur Ruziev <resurtm@gmail.com>
 * @since 2.0
 */
class QueryBuilder extends \yii\db\QueryBuilder
{
	/**
	 * @var array mapping from abstract column types (keys) to physical column types (values).
	 */
Alexander Makarov committed
23
	public $typeMap = [
24
		Schema::TYPE_PK => 'int IDENTITY PRIMARY KEY',
25
		Schema::TYPE_BIGPK => 'bigint IDENTITY PRIMARY KEY',
26 27
		Schema::TYPE_STRING => 'varchar(255)',
		Schema::TYPE_TEXT => 'text',
28 29 30
		Schema::TYPE_SMALLINT => 'smallint',
		Schema::TYPE_INTEGER => 'int',
		Schema::TYPE_BIGINT => 'bigint',
31
		Schema::TYPE_FLOAT => 'float',
32
		Schema::TYPE_DECIMAL => 'decimal',
33 34 35 36 37
		Schema::TYPE_DATETIME => 'datetime',
		Schema::TYPE_TIMESTAMP => 'timestamp',
		Schema::TYPE_TIME => 'time',
		Schema::TYPE_DATE => 'date',
		Schema::TYPE_BINARY => 'binary',
38
		Schema::TYPE_BOOLEAN => 'bit',
39
		Schema::TYPE_MONEY => 'decimal(19,4)',
Alexander Makarov committed
40
	];
resurtm committed
41 42 43 44 45 46 47 48 49 50 51

//	public function update($table, $columns, $condition, &$params)
//	{
//		return '';
//	}

//	public function delete($table, $condition, &$params)
//	{
//		return '';
//	}

52 53 54
	/**
	 * @param integer $limit
	 * @param integer $offset
55
	 * @return string the LIMIT and OFFSET clauses built from [[\yii\db\Query::$limit]].
56 57 58
	 */
	public function buildLimit($limit, $offset = 0)
	{
59 60 61 62 63 64 65
		$hasOffset = $this->hasOffset($offset);
		$hasLimit = $this->hasLimit($limit);
		if ($hasOffset || $hasLimit) {
			// http://technet.microsoft.com/en-us/library/gg699618.aspx
			$sql = 'OFFSET ' . ($hasOffset ? $offset : '0');
			if ($hasLimit) {
				$sql .= " FETCH NEXT $limit ROWS ONLY";
66
			}
67 68 69
			return $sql;
		} else {
			return '';
70 71
		}
	}
resurtm committed
72 73 74 75 76 77

//	public function resetSequence($table, $value = null)
//	{
//		return '';
//	}

Qiang Xue committed
78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111
	/**
	 * Builds a SQL statement for renaming a DB table.
	 * @param string $table the table to be renamed. The name will be properly quoted by the method.
	 * @param string $newName the new table name. The name will be properly quoted by the method.
	 * @return string the SQL statement for renaming a DB table.
	 */
	public function renameTable($table, $newName)
	{
		return "sp_rename '$table', '$newName'";
	}

	/**
	 * Builds a SQL statement for renaming a column.
	 * @param string $table the table whose column is to be renamed. The name will be properly quoted by the method.
	 * @param string $name the old name of the column. The name will be properly quoted by the method.
	 * @param string $newName the new name of the column. The name will be properly quoted by the method.
	 * @return string the SQL statement for renaming a DB column.
	 */
	public function renameColumn($table, $name, $newName)
	{
		return "sp_rename '$table.$name', '$newName', 'COLUMN'";
	}

	/**
	 * Builds a SQL statement for changing the definition of a column.
	 * @param string $table the table whose column is to be changed. The table name will be properly quoted by the method.
	 * @param string $column the name of the column to be changed. The name will be properly quoted by the method.
	 * @param string $type the new column type. The {@link getColumnType} method will be invoked to convert abstract column type (if any)
	 * into the physical one. Anything that is not recognized as abstract type will be kept in the generated SQL.
	 * For example, 'string' will be turned into 'varchar(255)', while 'string not null' will become 'varchar(255) not null'.
	 * @return string the SQL statement for changing the definition of a column.
	 */
	public function alterColumn($table, $column, $type)
	{
Luciano Baraglia committed
112 113
		$type = $this->getColumnType($type);
		$sql = 'ALTER TABLE ' . $this->db->quoteTableName($table) . ' ALTER COLUMN '
Qiang Xue committed
114 115 116 117 118
			. $this->db->quoteColumnName($column) . ' '
			. $this->getColumnType($type);
		return $sql;
	}

resurtm committed
119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138
	/**
	 * Builds a SQL statement for enabling or disabling integrity check.
	 * @param boolean $check whether to turn on or off the integrity check.
	 * @param string $schema the schema of the tables. Defaults to empty string, meaning the current or default schema.
	 * @param string $table the table name. Defaults to empty string, meaning that no table will be changed.
	 * @return string the SQL statement for checking integrity
	 * @throws InvalidParamException if the table does not exist or there is no sequence associated with the table.
	 */
	public function checkIntegrity($check = true, $schema = '', $table = '')
	{
		if ($schema !== '') {
			$table = "{$schema}.{$table}";
		}
		$table = $this->db->quoteTableName($table);
		if ($this->db->getTableSchema($table) === null) {
			throw new InvalidParamException("Table not found: $table");
		}
		$enable = $check ? 'CHECK' : 'NOCHECK';
		return "ALTER TABLE {$table} {$enable} CONSTRAINT ALL";
	}
139
}