溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

Yii2中mssql和sql server數(shù)據(jù)庫(kù)如何使用

發(fā)布時(shí)間:2021-07-24 16:11:34 來(lái)源:億速云 閱讀:253 作者:Leah 欄目:數(shù)據(jù)庫(kù)

本篇文章給大家分享的是有關(guān)Yii2中mssql和sql server數(shù)據(jù)庫(kù)如何使用,小編覺(jué)得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話(huà)不多說(shuō),跟著小編一起來(lái)看看吧。

  1.首先找到y(tǒng)ii2解析mssql的scheme:

  vendor/yiisoft/yii2/db/mssql/Schema.php

  2.更改解析代碼:

 ?、耪业絝indColumns 的函數(shù) 大概在232行左右

 ?、铺娲馕?代碼如下 :

  /**

  * Collects the metadata of table columns.

  * @param TableSchema $table the table metadata

  * @return boolean whether the table exists in the database

  */

  protected function findColumns($table)

  {

  $pdo = $this->db->getSlavePdo();

  $version = explode('.', $pdo->getAttribute(\PDO::ATTR_SERVER_VERSION));

  //var_dump($version);exit;

  if (intval($version[0]<9)) {   $sql = <<   SELECT   column_name = a.name,   is_identity = case when exists(SELECT 1 FROM sysobjects where xtype='PK' and parent_obj=a.id and name in (   SELECT name FROM sysindexes WHERE indid in(   SELECT indid FROM sysindexkeys WHERE id = a.id AND colid=a.colid))) then 1 else 0 end,   data_type = case   when b.name in ('ntext','datetime') then b.name   when isnull(COLUMNPROPERTY(a.id,a.name,'Scale'),0)>0 then

  b.name + '(' + convert(varchar(20), COLUMNPROPERTY(a.id,a.name,'PRECISION')) + ','+convert(varchar(10), COLUMNPROPERTY(a.id,a.name,'Scale'))+')'

  else b.name + '(' + convert(varchar(20), COLUMNPROPERTY(a.id,a.name,'PRECISION')) + ')' end ,

  is_nullable = case when a.isnullable=1 then 'Yes' else 'No' end,

  column_default = isnull(e.text,''),

  comment = isnull(g.[value],'')

  FROM

  syscolumns a

  left join

  systypes b

  on

  a.xusertype=b.xusertype

  inner join

  sysobjects d

  on

  a.id=d.id and d.xtype='U' and d.name<>'dtproperties'

  left join

  syscomments e

  on

  a.cdefault=e.id

  left join

  sysproperties g

  on

  a.id=g.id and a.colid=g.smallid

  left join

  sysproperties f

  on

  d.id=f.id and f.smallid=0

  where

  d.name='{$table->fullName}'

  order by

  a.id,a.colorder

  SQL2000;

  }

  else {

  $columnsTableName = 'INFORMATION_SCHEMA.COLUMNS';

  $whereSql = "[t1].[table_name] = '{$table->name}'";

  if ($table->catalogName !== null) {

  $columnsTableName = "{$table->catalogName}.{$columnsTableName}";

  $whereSql .= " AND [t1].[table_catalog] = '{$table->catalogName}'";

  }

  if ($table->schemaName !== null) {

  $whereSql .= " AND [t1].[table_schema] = '{$table->schemaName}'";

  }

  $columnsTableName = $this->quoteTableName($columnsTableName);

  $sql = <<   SELECT   [t1].[column_name], [t1].[is_nullable], [t1].[data_type], [t1].[column_default],   COLUMNPROPERTY(OBJECT_ID([t1].[table_schema] + '.' + [t1].[table_name]), [t1].[column_name], 'IsIdentity') AS is_identity,   CONVERT(VARCHAR, [t2].[value]) AS comment   FROM {$columnsTableName} AS [t1]   LEFT OUTER JOIN [sys].[extended_properties] AS [t2] ON   [t2].[minor_id] = COLUMNPROPERTY(OBJECT_ID([t1].[TABLE_SCHEMA] + '.' + [t1].[TABLE_NAME]), [t1].[COLUMN_NAME], 'ColumnID') AND   OBJECT_NAME([t2].[major_id]) = [t1].[table_name] AND   [t2].[class] = 1 AND   [t2].[class_desc] = 'OBJECT_OR_COLUMN' AND   [t2].[name] = 'MS_Description'   WHERE {$whereSql}   SQL;   }   try {   $columns = $this->db->createCommand($sql)->queryAll();

  if (empty($columns)) {

  return false;

  }

  } catch (\Exception $e) {

  return false;

  }

  foreach ($columns as $column) {

  $column = $this->loadColumnSchema($column);

  foreach ($table->primaryKey as $primaryKey) {

  if (strcasecmp($column->name, $primaryKey) === 0) {

  $column->isPrimaryKey = true;

  break;

  }

  }

  if ($column->isPrimaryKey && $column->autoIncrement) {

  $table->sequenceName = '';

  }

  $table->columns[$column->name] = $column;

  }

  return true;

  }

  3.分析這段代碼:

  ⑴獲取數(shù)據(jù)庫(kù)的版本:

  $pdo = $this->db->getSlavePdo();

  $version = explode('.', $pdo->getAttribute(\PDO::ATTR_SERVER_VERSION));

  ⑵根據(jù)版本解析:

  if (intval($version[0]<9)) { }else{}  ?、墙馕鰏ql2000:   $sql = <<   SELECT   column_name = a.name,   is_identity = case when exists(SELECT 1 FROM sysobjects where xtype='PK' and parent_obj=a.id and name in (   SELECT name FROM sysindexes WHERE indid in(   SELECT indid FROM sysindexkeys WHERE id = a.id AND colid=a.colid))) then 1 else 0 end,   data_type = case   when b.name in ('ntext','datetime') then b.name   when isnull(COLUMNPROPERTY(a.id,a.name,'Scale'),0)>0 then

  b.name + '(' + convert(varchar(20), COLUMNPROPERTY(a.id,a.name,'PRECISION')) + ','+convert(varchar(10), COLUMNPROPERTY(a.id,a.name,'Scale'))+')'

  else b.name + '(' + convert(varchar(20), COLUMNPROPERTY(a.id,a.name,'PRECISION')) + ')' end ,

  is_nullable = case when a.isnullable=1 then 'Yes' else 'No' end,

  column_default = isnull(e.text,''),

  comment = isnull(g.[value],'')

  FROM

  syscolumns a

  left join

  systypes b

  on

  a.xusertype=b.xusertype

  inner join

  sysobjects d

  on

  a.id=d.id and d.xtype='U' and d.name<>'dtproperties'

  left join

  syscomments e

  on

  a.cdefault=e.id

  left join

  sysproperties g

  on

  a.id=g.id and a.colid=g.smallid

  left join

  sysproperties f

  on

  d.id=f.id and f.smallid=0

  where

  d.name='{$table->fullName}'

  order by

  a.id,a.colorder

  SQL2000;

  ⑷else 就是原來(lái)的解析方式 3.打開(kāi)sql的數(shù)據(jù)庫(kù)scheme的緩存,在db.php文件中添加 :'enableSchemaCache'=>true 既可以。

以上就是Yii2中mssql和sql server數(shù)據(jù)庫(kù)如何使用,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見(jiàn)到或用到的。希望你能通過(guò)這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI