Вход Регистрация
Файл: system/vendor/illuminate/database/Schema/Grammars/SqlServerGrammar.php
Строк: 1265
<?php

namespace IlluminateDatabaseSchemaGrammars;

use 
IlluminateDatabaseSchemaBlueprint;
use 
IlluminateSupportFluent;

class 
SqlServerGrammar extends Grammar
{
    
/**
     * If this Grammar supports schema changes wrapped in a transaction.
     *
     * @var bool
     */
    
protected $transactions true;

    
/**
     * The possible column modifiers.
     *
     * @var array
     */
    
protected $modifiers = ['Increment''Collate''Nullable''Default''Persisted'];

    
/**
     * The columns available as serials.
     *
     * @var array
     */
    
protected $serials = ['tinyInteger''smallInteger''mediumInteger''integer''bigInteger'];

    
/**
     * Compile the query to determine if a table exists.
     *
     * @return string
     */
    
public function compileTableExists()
    {
        return 
"select * from sysobjects where type = 'U' and name = ?";
    }

    
/**
     * Compile the query to determine the list of columns.
     *
     * @param  string  $table
     * @return string
     */
    
public function compileColumnListing($table)
    {
        return 
"select col.name from sys.columns as col
                join sys.objects as obj on col.object_id = obj.object_id
                where obj.type = 'U' and obj.name = '
$table'";
    }

    
/**
     * Compile a create table command.
     *
     * @param  IlluminateDatabaseSchemaBlueprint  $blueprint
     * @param  IlluminateSupportFluent  $command
     * @return string
     */
    
public function compileCreate(Blueprint $blueprintFluent $command)
    {
        
$columns implode(', '$this->getColumns($blueprint));

        return 
'create table '.$this->wrapTable($blueprint)." ($columns)";
    }

    
/**
     * Compile a column addition table command.
     *
     * @param  IlluminateDatabaseSchemaBlueprint  $blueprint
     * @param  IlluminateSupportFluent  $command
     * @return string
     */
    
public function compileAdd(Blueprint $blueprintFluent $command)
    {
        return 
sprintf('alter table %s add %s',
            
$this->wrapTable($blueprint),
            
implode(', '$this->getColumns($blueprint))
        );
    }

    
/**
     * Compile a primary key command.
     *
     * @param  IlluminateDatabaseSchemaBlueprint  $blueprint
     * @param  IlluminateSupportFluent  $command
     * @return string
     */
    
public function compilePrimary(Blueprint $blueprintFluent $command)
    {
        return 
sprintf('alter table %s add constraint %s primary key (%s)',
            
$this->wrapTable($blueprint),
            
$this->wrap($command->index),
            
$this->columnize($command->columns)
        );
    }

    
/**
     * Compile a unique key command.
     *
     * @param  IlluminateDatabaseSchemaBlueprint  $blueprint
     * @param  IlluminateSupportFluent  $command
     * @return string
     */
    
public function compileUnique(Blueprint $blueprintFluent $command)
    {
        return 
sprintf('create unique index %s on %s (%s)',
            
$this->wrap($command->index),
            
$this->wrapTable($blueprint),
            
$this->columnize($command->columns)
        );
    }

    
/**
     * Compile a plain index key command.
     *
     * @param  IlluminateDatabaseSchemaBlueprint  $blueprint
     * @param  IlluminateSupportFluent  $command
     * @return string
     */
    
public function compileIndex(Blueprint $blueprintFluent $command)
    {
        return 
sprintf('create index %s on %s (%s)',
            
$this->wrap($command->index),
            
$this->wrapTable($blueprint),
            
$this->columnize($command->columns)
        );
    }

    
/**
     * Compile a spatial index key command.
     *
     * @param  IlluminateDatabaseSchemaBlueprint  $blueprint
     * @param  IlluminateSupportFluent  $command
     * @return string
     */
    
public function compileSpatialIndex(Blueprint $blueprintFluent $command)
    {
        return 
sprintf('create spatial index %s on %s (%s)',
            
$this->wrap($command->index),
            
$this->wrapTable($blueprint),
            
$this->columnize($command->columns)
        );
    }

    
/**
     * Compile a drop table command.
     *
     * @param  IlluminateDatabaseSchemaBlueprint  $blueprint
     * @param  IlluminateSupportFluent  $command
     * @return string
     */
    
public function compileDrop(Blueprint $blueprintFluent $command)
    {
        return 
'drop table '.$this->wrapTable($blueprint);
    }

    
/**
     * Compile a drop table (if exists) command.
     *
     * @param  IlluminateDatabaseSchemaBlueprint  $blueprint
     * @param  IlluminateSupportFluent  $command
     * @return string
     */
    
public function compileDropIfExists(Blueprint $blueprintFluent $command)
    {
        return 
sprintf('if exists (select * from INFORMATION_SCHEMA.TABLES where TABLE_NAME = %s) drop table %s',
            
"'".str_replace("'""''"$this->getTablePrefix().$blueprint->getTable())."'",
            
$this->wrapTable($blueprint)
        );
    }

    
/**
     * Compile the SQL needed to drop all tables.
     *
     * @return string
     */
    
public function compileDropAllTables()
    {
        return 
"EXEC sp_msforeachtable 'DROP TABLE ?'";
    }

    
/**
     * Compile a drop column command.
     *
     * @param  IlluminateDatabaseSchemaBlueprint  $blueprint
     * @param  IlluminateSupportFluent  $command
     * @return string
     */
    
public function compileDropColumn(Blueprint $blueprintFluent $command)
    {
        
$columns $this->wrapArray($command->columns);

        
$dropExistingConstraintsSql $this->compileDropDefaultConstraint($blueprint$command).';';

        return 
$dropExistingConstraintsSql.'alter table '.$this->wrapTable($blueprint).' drop column '.implode(', '$columns);
    }

    
/**
     * Compile a drop default constraint command.
     *
     * @param  IlluminateDatabaseSchemaBlueprint  $blueprint
     * @param  IlluminateSupportFluent  $command
     * @return string
     */
    
public function compileDropDefaultConstraint(Blueprint $blueprintFluent $command)
    {
        
$columns "'".implode("','"$command->columns)."'";

        
$sql "DECLARE @sql NVARCHAR(MAX) = '';";
        
$sql .= "SELECT @sql += 'ALTER TABLE [dbo].[{$blueprint->getTable()}] DROP CONSTRAINT ' + OBJECT_NAME([default_object_id]) + ';' ";
        
$sql .= 'FROM SYS.COLUMNS ';
        
$sql .= "WHERE [object_id] = OBJECT_ID('[dbo].[{$blueprint->getTable()}]') AND [name] in ({$columns}) AND [default_object_id] <> 0;";
        
$sql .= 'EXEC(@sql)';

        return 
$sql;
    }

    
/**
     * Compile a drop primary key command.
     *
     * @param  IlluminateDatabaseSchemaBlueprint  $blueprint
     * @param  IlluminateSupportFluent  $command
     * @return string
     */
    
public function compileDropPrimary(Blueprint $blueprintFluent $command)
    {
        
$index $this->wrap($command->index);

        return 
"alter table {$this->wrapTable($blueprint)} drop constraint {$index}";
    }

    
/**
     * Compile a drop unique key command.
     *
     * @param  IlluminateDatabaseSchemaBlueprint  $blueprint
     * @param  IlluminateSupportFluent  $command
     * @return string
     */
    
public function compileDropUnique(Blueprint $blueprintFluent $command)
    {
        
$index $this->wrap($command->index);

        return 
"drop index {$index} on {$this->wrapTable($blueprint)}";
    }

    
/**
     * Compile a drop index command.
     *
     * @param  IlluminateDatabaseSchemaBlueprint  $blueprint
     * @param  IlluminateSupportFluent  $command
     * @return string
     */
    
public function compileDropIndex(Blueprint $blueprintFluent $command)
    {
        
$index $this->wrap($command->index);

        return 
"drop index {$index} on {$this->wrapTable($blueprint)}";
    }

    
/**
     * Compile a drop spatial index command.
     *
     * @param  IlluminateDatabaseSchemaBlueprint  $blueprint
     * @param  IlluminateSupportFluent  $command
     * @return string
     */
    
public function compileDropSpatialIndex(Blueprint $blueprintFluent $command)
    {
        return 
$this->compileDropIndex($blueprint$command);
    }

    
/**
     * Compile a drop foreign key command.
     *
     * @param  IlluminateDatabaseSchemaBlueprint  $blueprint
     * @param  IlluminateSupportFluent  $command
     * @return string
     */
    
public function compileDropForeign(Blueprint $blueprintFluent $command)
    {
        
$index $this->wrap($command->index);

        return 
"alter table {$this->wrapTable($blueprint)} drop constraint {$index}";
    }

    
/**
     * Compile a rename table command.
     *
     * @param  IlluminateDatabaseSchemaBlueprint  $blueprint
     * @param  IlluminateSupportFluent  $command
     * @return string
     */
    
public function compileRename(Blueprint $blueprintFluent $command)
    {
        
$from $this->wrapTable($blueprint);

        return 
"sp_rename {$from}, ".$this->wrapTable($command->to);
    }

    
/**
     * Compile a rename index command.
     *
     * @param  IlluminateDatabaseSchemaBlueprint  $blueprint
     * @param  IlluminateSupportFluent  $command
     * @return string
     */
    
public function compileRenameIndex(Blueprint $blueprintFluent $command)
    {
        return 
sprintf("sp_rename N'%s', %s, N'INDEX'",
            
$this->wrap($blueprint->getTable().'.'.$command->from),
            
$this->wrap($command->to)
        );
    }

    
/**
     * Compile the command to enable foreign key constraints.
     *
     * @return string
     */
    
public function compileEnableForeignKeyConstraints()
    {
        return 
'EXEC sp_msforeachtable @command1="print '?'", @command2="ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all";';
    }

    
/**
     * Compile the command to disable foreign key constraints.
     *
     * @return string
     */
    
public function compileDisableForeignKeyConstraints()
    {
        return 
'EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all";';
    }

    
/**
     * Compile the command to drop all foreign keys.
     *
     * @return string
     */
    
public function compileDropAllForeignKeys()
    {
        return 
"DECLARE @sql NVARCHAR(MAX) = N'';
            SELECT @sql += 'ALTER TABLE '
                + QUOTENAME(OBJECT_SCHEMA_NAME(parent_object_id)) + '.' + + QUOTENAME(OBJECT_NAME(parent_object_id))
                + ' DROP CONSTRAINT ' + QUOTENAME(name) + ';'
            FROM sys.foreign_keys;

            EXEC sp_executesql @sql;"
;
    }

    
/**
     * Compile the command to drop all views.
     *
     * @return string
     */
    
public function compileDropAllViews()
    {
        return 
"DECLARE @sql NVARCHAR(MAX) = N'';
            SELECT @sql += 'DROP VIEW ' + QUOTENAME(OBJECT_SCHEMA_NAME(object_id)) + '.' + QUOTENAME(name) + ';'
            FROM sys.views;

            EXEC sp_executesql @sql;"
;
    }

    
/**
     * Create the column definition for a char type.
     *
     * @param  IlluminateSupportFluent  $column
     * @return string
     */
    
protected function typeChar(Fluent $column)
    {
        return 
"nchar({$column->length})";
    }

    
/**
     * Create the column definition for a string type.
     *
     * @param  IlluminateSupportFluent  $column
     * @return string
     */
    
protected function typeString(Fluent $column)
    {
        return 
"nvarchar({$column->length})";
    }

    
/**
     * Create the column definition for a text type.
     *
     * @param  IlluminateSupportFluent  $column
     * @return string
     */
    
protected function typeText(Fluent $column)
    {
        return 
'nvarchar(max)';
    }

    
/**
     * Create the column definition for a medium text type.
     *
     * @param  IlluminateSupportFluent  $column
     * @return string
     */
    
protected function typeMediumText(Fluent $column)
    {
        return 
'nvarchar(max)';
    }

    
/**
     * Create the column definition for a long text type.
     *
     * @param  IlluminateSupportFluent  $column
     * @return string
     */
    
protected function typeLongText(Fluent $column)
    {
        return 
'nvarchar(max)';
    }

    
/**
     * Create the column definition for an integer type.
     *
     * @param  IlluminateSupportFluent  $column
     * @return string
     */
    
protected function typeInteger(Fluent $column)
    {
        return 
'int';
    }

    
/**
     * Create the column definition for a big integer type.
     *
     * @param  IlluminateSupportFluent  $column
     * @return string
     */
    
protected function typeBigInteger(Fluent $column)
    {
        return 
'bigint';
    }

    
/**
     * Create the column definition for a medium integer type.
     *
     * @param  IlluminateSupportFluent  $column
     * @return string
     */
    
protected function typeMediumInteger(Fluent $column)
    {
        return 
'int';
    }

    
/**
     * Create the column definition for a tiny integer type.
     *
     * @param  IlluminateSupportFluent  $column
     * @return string
     */
    
protected function typeTinyInteger(Fluent $column)
    {
        return 
'tinyint';
    }

    
/**
     * Create the column definition for a small integer type.
     *
     * @param  IlluminateSupportFluent  $column
     * @return string
     */
    
protected function typeSmallInteger(Fluent $column)
    {
        return 
'smallint';
    }

    
/**
     * Create the column definition for a float type.
     *
     * @param  IlluminateSupportFluent  $column
     * @return string
     */
    
protected function typeFloat(Fluent $column)
    {
        return 
'float';
    }

    
/**
     * Create the column definition for a double type.
     *
     * @param  IlluminateSupportFluent  $column
     * @return string
     */
    
protected function typeDouble(Fluent $column)
    {
        return 
'float';
    }

    
/**
     * Create the column definition for a decimal type.
     *
     * @param  IlluminateSupportFluent  $column
     * @return string
     */
    
protected function typeDecimal(Fluent $column)
    {
        return 
"decimal({$column->total}{$column->places})";
    }

    
/**
     * Create the column definition for a boolean type.
     *
     * @param  IlluminateSupportFluent  $column
     * @return string
     */
    
protected function typeBoolean(Fluent $column)
    {
        return 
'bit';
    }

    
/**
     * Create the column definition for an enumeration type.
     *
     * @param  IlluminateSupportFluent  $column
     * @return string
     */
    
protected function typeEnum(Fluent $column)
    {
        return 
sprintf(
            
'nvarchar(255) check ("%s" in (%s))',
            
$column->name,
            
$this->quoteString($column->allowed)
        );
    }

    
/**
     * Create the column definition for a json type.
     *
     * @param  IlluminateSupportFluent  $column
     * @return string
     */
    
protected function typeJson(Fluent $column)
    {
        return 
'nvarchar(max)';
    }

    
/**
     * Create the column definition for a jsonb type.
     *
     * @param  IlluminateSupportFluent  $column
     * @return string
     */
    
protected function typeJsonb(Fluent $column)
    {
        return 
'nvarchar(max)';
    }

    
/**
     * Create the column definition for a date type.
     *
     * @param  IlluminateSupportFluent  $column
     * @return string
     */
    
protected function typeDate(Fluent $column)
    {
        return 
'date';
    }

    
/**
     * Create the column definition for a date-time type.
     *
     * @param  IlluminateSupportFluent  $column
     * @return string
     */
    
protected function typeDateTime(Fluent $column)
    {
        return 
$this->typeTimestamp($column);
    }

    
/**
     * Create the column definition for a date-time (with time zone) type.
     *
     * @param  IlluminateSupportFluent  $column
     * @return string
     */
    
protected function typeDateTimeTz(Fluent $column)
    {
        return 
$this->typeTimestampTz($column);
    }

    
/**
     * Create the column definition for a time type.
     *
     * @param  IlluminateSupportFluent  $column
     * @return string
     */
    
protected function typeTime(Fluent $column)
    {
        return 
$column->precision "time($column->precision)" 'time';
    }

    
/**
     * Create the column definition for a time (with time zone) type.
     *
     * @param  IlluminateSupportFluent  $column
     * @return string
     */
    
protected function typeTimeTz(Fluent $column)
    {
        return 
$this->typeTime($column);
    }

    
/**
     * Create the column definition for a timestamp type.
     *
     * @param  IlluminateSupportFluent  $column
     * @return string
     */
    
protected function typeTimestamp(Fluent $column)
    {
        
$columnType $column->precision "datetime2($column->precision)" 'datetime';

        return 
$column->useCurrent "$columnType default CURRENT_TIMESTAMP" $columnType;
    }

    
/**
     * Create the column definition for a timestamp (with time zone) type.
     *
     * @link https://docs.microsoft.com/en-us/sql/t-sql/data-types/datetimeoffset-transact-sql?view=sql-server-ver15
     *
     * @param  IlluminateSupportFluent  $column
     * @return string
     */
    
protected function typeTimestampTz(Fluent $column)
    {
        
$columnType $column->precision "datetimeoffset($column->precision)" 'datetimeoffset';

        return 
$column->useCurrent "$columnType default CURRENT_TIMESTAMP" $columnType;
    }

    
/**
     * Create the column definition for a year type.
     *
     * @param  IlluminateSupportFluent  $column
     * @return string
     */
    
protected function typeYear(Fluent $column)
    {
        return 
$this->typeInteger($column);
    }

    
/**
     * Create the column definition for a binary type.
     *
     * @param  IlluminateSupportFluent  $column
     * @return string
     */
    
protected function typeBinary(Fluent $column)
    {
        return 
'varbinary(max)';
    }

    
/**
     * Create the column definition for a uuid type.
     *
     * @param  IlluminateSupportFluent  $column
     * @return string
     */
    
protected function typeUuid(Fluent $column)
    {
        return 
'uniqueidentifier';
    }

    
/**
     * Create the column definition for an IP address type.
     *
     * @param  IlluminateSupportFluent  $column
     * @return string
     */
    
protected function typeIpAddress(Fluent $column)
    {
        return 
'nvarchar(45)';
    }

    
/**
     * Create the column definition for a MAC address type.
     *
     * @param  IlluminateSupportFluent  $column
     * @return string
     */
    
protected function typeMacAddress(Fluent $column)
    {
        return 
'nvarchar(17)';
    }

    
/**
     * Create the column definition for a spatial Geometry type.
     *
     * @param  IlluminateSupportFluent  $column
     * @return string
     */
    
public function typeGeometry(Fluent $column)
    {
        return 
'geography';
    }

    
/**
     * Create the column definition for a spatial Point type.
     *
     * @param  IlluminateSupportFluent  $column
     * @return string
     */
    
public function typePoint(Fluent $column)
    {
        return 
'geography';
    }

    
/**
     * Create the column definition for a spatial LineString type.
     *
     * @param  IlluminateSupportFluent  $column
     * @return string
     */
    
public function typeLineString(Fluent $column)
    {
        return 
'geography';
    }

    
/**
     * Create the column definition for a spatial Polygon type.
     *
     * @param  IlluminateSupportFluent  $column
     * @return string
     */
    
public function typePolygon(Fluent $column)
    {
        return 
'geography';
    }

    
/**
     * Create the column definition for a spatial GeometryCollection type.
     *
     * @param  IlluminateSupportFluent  $column
     * @return string
     */
    
public function typeGeometryCollection(Fluent $column)
    {
        return 
'geography';
    }

    
/**
     * Create the column definition for a spatial MultiPoint type.
     *
     * @param  IlluminateSupportFluent  $column
     * @return string
     */
    
public function typeMultiPoint(Fluent $column)
    {
        return 
'geography';
    }

    
/**
     * Create the column definition for a spatial MultiLineString type.
     *
     * @param  IlluminateSupportFluent  $column
     * @return string
     */
    
public function typeMultiLineString(Fluent $column)
    {
        return 
'geography';
    }

    
/**
     * Create the column definition for a spatial MultiPolygon type.
     *
     * @param  IlluminateSupportFluent  $column
     * @return string
     */
    
public function typeMultiPolygon(Fluent $column)
    {
        return 
'geography';
    }

    
/**
     * Create the column definition for a generated, computed column type.
     *
     * @param  IlluminateSupportFluent  $column
     * @return string|null
     */
    
protected function typeComputed(Fluent $column)
    {
        return 
"as ({$column->expression})";
    }

    
/**
     * Get the SQL for a collation column modifier.
     *
     * @param  IlluminateDatabaseSchemaBlueprint  $blueprint
     * @param  IlluminateSupportFluent  $column
     * @return string|null
     */
    
protected function modifyCollate(Blueprint $blueprintFluent $column)
    {
        if (! 
is_null($column->collation)) {
            return 
' collate '.$column->collation;
        }
    }

    
/**
     * Get the SQL for a nullable column modifier.
     *
     * @param  IlluminateDatabaseSchemaBlueprint  $blueprint
     * @param  IlluminateSupportFluent  $column
     * @return string|null
     */
    
protected function modifyNullable(Blueprint $blueprintFluent $column)
    {
        if (
$column->type !== 'computed') {
            return 
$column->nullable ' null' ' not null';
        }
    }

    
/**
     * Get the SQL for a default column modifier.
     *
     * @param  IlluminateDatabaseSchemaBlueprint  $blueprint
     * @param  IlluminateSupportFluent  $column
     * @return string|null
     */
    
protected function modifyDefault(Blueprint $blueprintFluent $column)
    {
        if (! 
is_null($column->default)) {
            return 
' default '.$this->getDefaultValue($column->default);
        }
    }

    
/**
     * Get the SQL for an auto-increment column modifier.
     *
     * @param  IlluminateDatabaseSchemaBlueprint  $blueprint
     * @param  IlluminateSupportFluent  $column
     * @return string|null
     */
    
protected function modifyIncrement(Blueprint $blueprintFluent $column)
    {
        if (
in_array($column->type$this->serials) && $column->autoIncrement) {
            return 
' identity primary key';
        }
    }

    
/**
     * Get the SQL for a generated stored column modifier.
     *
     * @param  IlluminateDatabaseSchemaBlueprint  $blueprint
     * @param  IlluminateSupportFluent  $column
     * @return string|null
     */
    
protected function modifyPersisted(Blueprint $blueprintFluent $column)
    {
        if (
$column->persisted) {
            return 
' persisted';
        }
    }

    
/**
     * Wrap a table in keyword identifiers.
     *
     * @param  IlluminateDatabaseQueryExpression|string  $table
     * @return string
     */
    
public function wrapTable($table)
    {
        if (
$table instanceof Blueprint && $table->temporary) {
            
$this->setTablePrefix('#');
        }

        return 
parent::wrapTable($table);
    }

    
/**
     * Quote the given string literal.
     *
     * @param  string|array  $value
     * @return string
     */
    
public function quoteString($value)
    {
        if (
is_array($value)) {
            return 
implode(', 'array_map([$this__FUNCTION__], $value));
        }

        return 
"N'$value'";
    }
}
Онлайн: 3
Реклама