原文地址:http://www.yiiframework.com/doc/guide/1.1/en/database.query-builder
不過原文是英文的,Yii的官網沒有翻譯這一章,自己就嘗試著翻譯了一下,有很多地方時會按自己的理解寫,不一定完全按原文翻譯。。。
Yii的查詢生成器提供了用面向對象的方式寫SQL語句。它允許開發人員使用類的方法和屬性來指定一個SQL語句的各個部分。然後,組裝成一個有效的SQL語句,可以通過調用DAO數據訪問對象的描述方法為進一步執行。以下顯示了一個典型的使用查詢生成器建立一個select語句:
$user = Yii::app()->db->createCommand() ->select('id, username, profile') ->from('tbl_user u') ->join('tbl_profile p', 'u.id=p.user_id') ->where('id=:id', array(':id'=>$id)) ->queryRow();
當你在應用程序中需要組裝SQL語句的程序,或基於一些條件邏輯時,最好使用查詢生成器。使用查詢生成器的好處主要包括:
它可以建立復雜的SQL語句編程。
它會自引用表名和列名防止SQL保留字和特殊字符的沖突。
它還可以引用參數值和使用參數綁定,這有助於減少SQL注入攻擊的風險。
它提供了一定程度的數據庫抽象,簡化了遷移到不同的數據庫平台的成本。
它不強制使用查詢生成器。事實上,如果你的查詢是簡單的,它是更容易和更快的直接寫SQL語句。
注:查詢生成器不能用於修改現有的查詢指定為SQL語句。例如,下面的代碼將不能工作:
$command = Yii::app()->db->createCommand('SELECT * FROM tbl_user'); // the following line will NOT append WHERE clause to the above SQL $command->where('id=:id', array(':id'=>$id));
換句話說,不要混合使用普通的SQL和查詢生成器。
Yii的查詢生成器是從 CDbCommand 提供主要數據庫查詢類,描述數據訪問對象。
開始使用查詢生成器,我們創造了 CDbCommand 的一個新實例,
$command = Yii::app()->db->createCommand();
我們使用 Yii::app()->db
來獲得數據庫連接,然後調用 CDbConnection::createCommand() 創建所需的命令實例。
請注意,將整個SQL語句放入 createcommand() ,叫做數據訪問對象,我們需呀把設置它為空。這是因為我們將在下面的解釋中使用查詢生成器添加SQL語句的各個部分的方法。
數據檢索查詢是指選擇SQL語句。查詢生成器提供了一套方法來建立一個SELECT語句的各個部分。因為所有這些方法返回 CDbCommand 的實例,我們可以使用方法鏈調用他們,如圖所示,在本節開頭的例子。
AND
operatorOR
operator在下面,我們將解釋如何使用這些查詢生成器方法。為簡單起見,我們假設底層數據庫是MySQL。注意:如果你使用的是其他數據庫,表/列/值引用的例子可能是不同的。
function select($columns='*')
該select()方法指定一個查詢的選擇部分。$columns參數指定要選擇的列,它可以是一個字符串,用逗號分隔列,或者一個數組的列名稱。列的名稱可以包含表的前綴和 / 或列別名。該方法將自動引用列名,除非一列包含一些括號(這意味著這個列是一個DB的表達式)。
下面是一些例子:
// SELECT * select() // SELECT `id`, `username` select('id, username') // SELECT `tbl_user`.`id`, `username` AS `name` select('tbl_user.id, username as name') // SELECT `id`, `username` select(array('id', 'username')) // SELECT `id`, count(*) as num select(array('id', 'count(*) as num'))
function selectDistinct($columns)
selectdistinct()方法類似於select(),除了它打開了 DISTINCT
的標志。例如,selectdistinct('id,用戶名”)會產生以下SQL:
SELECT DISTINCT `id`, `username`
function from($tables)
from()方法指定來了一個查詢的FROM部分。 $tables
參數指定表的選擇。這可以是一個字符串,用逗號分隔的表的名稱,或表名數組。表的名稱可以包含架構前綴(例如公共。tbl_user)和/或表的別名(e.g.tbl_user U)。該方法將自動引用表的名稱,除非它包含一些括號(即表是一個給定的子查詢或DB的表達式)。
下面是一些例子:
// FROM `tbl_user` from('tbl_user') // FROM `tbl_user` `u`, `public`.`tbl_profile` `p` from('tbl_user u, public.tbl_profile p') // FROM `tbl_user`, `tbl_profile` from(array('tbl_user', 'tbl_profile')) // FROM `tbl_user`, (select * from tbl_profile) p from(array('tbl_user', '(select * from tbl_profile) p'))
function where($conditions, $params=array())
where()方法指定查詢的WHERE。$conditions 參數指定查詢條件的同時,$params 指定參數綁定到整個查詢。$conditions參數可以是一個字符串(例如id = 1)或一個數組中的格式:
array(operator, operand1, operand2, ...)
operator
可以是以下的任何一個:
and
: operands 應該使用 and 連接在一起。例如, array('and', 'id=1', 'id=2')
將產生 id=1 AND id=2 。如果一個操作數是一個數組,它將使用這裡描述的相同規則轉換成一個字符串。例如,array('and', 'type=1', array('or', 'id=1', 'id=2')) 將生成 type=1 AND (id=1 OR id=2)
。
or
: 類似 and 操作,除了operands 是使用 OR 連接的。
in
: operand 1 應是一個列或 DB 表達式,而 operand 2 是代表值的范圍的數組,列或 DB 表達式應在這個數組的范圍內。例如,array('in', 'id', array(1,2,3))
將生成 id IN (1,2,3)
。
not in
: 類似 in 操作,除了用 NOT IN 代替 IN 去生成SQL。
like
: operand 1 應是一個列或 DB 表達式,而 operand 2 是代表值的范圍的數組,列或 DB 表達式應在這個數組的范圍內。例如,array('like', 'name', '%tester%')
會生成 name LIKE '%tester%'
。當規定值的范圍為一個數組時,多個 LIKE 生成SQL時會用 AND 連接。例如,array('like', 'name', array('%test%', '%sample%'))
會生成 name LIKE '%test%' AND name LIKE '%sample%'
。
not like
: 類似 like 的操作,除了用 NOT LIKE 代替 LIKE 去生成SQL。
or like
: 類似 like 的操作,除了多個 like 生成 SQL 時用OR連接。
or not like
: 類似 not like 的操作,除了多個 like 生成 SQL 時用OR連接。
下面是一些例子,使用的地方:
// WHERE id=1 or id=2 where('id=1 or id=2') // WHERE id=:id1 or id=:id2 where('id=:id1 or id=:id2', array(':id1'=>1, ':id2'=>2)) // WHERE id=1 OR id=2 where(array('or', 'id=1', 'id=2')) // WHERE id=1 AND (type=2 OR type=3) where(array('and', 'id=1', array('or', 'type=2', 'type=3'))) // WHERE `id` IN (1, 2) where(array('in', 'id', array(1, 2)) // WHERE `id` NOT IN (1, 2) where(array('not in', 'id', array(1,2))) // WHERE `name` LIKE '%Qiang%' where(array('like', 'name', '%Qiang%')) // WHERE `name` LIKE '%Qiang' AND `name` LIKE '%Xue' where(array('like', 'name', array('%Qiang', '%Xue'))) // WHERE `name` LIKE '%Qiang' OR `name` LIKE '%Xue' where(array('or like', 'name', array('%Qiang', '%Xue'))) // WHERE `name` NOT LIKE '%Qiang%' where(array('not like', 'name', '%Qiang%')) // WHERE `name` NOT LIKE '%Qiang%' OR `name` NOT LIKE '%Xue%' where(array('or not like', 'name', array('%Qiang%', '%Xue%')))
請注意,當操作者含有like時,我們必須明確指定的通配符(如%和_)的模式。如果參數是從用戶的輸入,我們也應該使用下面的代碼轉義特殊字符,以防止他們被當作通配符:
$keyword=$_GET['q']; // escape % and _ characters $keyword=strtr($keyword, array('%'=>'\%', '_'=>'\_')); $command->where(array('like', 'title', '%'.$keyword.'%'));
function andWhere($conditions, $params=array())
用 and 的方式添加到WHERE的條件中。此方法的行為幾乎是 where() 相同,除了它只是添加條件不能取代它。在 where() 文檔中有該方法參數的詳細信息。
function orWhere($conditions, $params=array())
用 or 的方式添加到WHERE的條件中。此方法的行為幾乎是 where() 相同,除了它只是添加條件不能取代它。在 where() 文檔中有該方法參數的詳細信息。
function order($columns)
order() 方法指定查詢的ORDER BY部分。$columns
參數指定列進行排序,這可以是一個包含用逗號分隔列和order的方向(ASC 或
DESC
)的字符串,或者一個列和order的方向的數組。列名稱可以包含表前綴。該方法將自動引用列名,除非一列包含一些括號(即給出一個 DB 表達式)。
下面是一些例子:
// ORDER BY `name`, `id` DESC order('name, id desc') // ORDER BY `tbl_profile`.`name`, `id` DESC order(array('tbl_profile.name', 'id desc'))
function limit($limit, $offset=null) function offset($offset)
limit()和offset()方法指定查詢的 LIMIT
和 OFFSET
部分。請注意,某些DBMS不支持 LIMIT
和 OFFSET
語法。在這種情況下,查詢生成器將改寫整個SQL語句來模擬 LIMIT
和 OFFSET 的
功能。
下面是一些例子:
// LIMIT 10 取前10條 limit(10) // LIMIT 10 OFFSET 20 取到第21~30條 limit(10, 20) // OFFSET 20 去掉前20條後剩下的數據 offset(20)
function join($table, $conditions, $params=array()) function leftJoin($table, $conditions, $params=array()) function rightJoin($table, $conditions, $params=array()) function crossJoin($table) function naturalJoin($table)
join()方法及其變種指定如何與其他表連接,使用內部聯接,左外連接,右外部聯接,交叉連接,或自然連接。 $table
參數指定要加入哪個表。表名可以包含數據庫的前綴和 / 或別名。該方法將引用表名,除非它包含一個插入語,即一個DB表達式或子查詢。 $conditions
參數指定連接條件。它的語法與where() 相同。$params
參數指定綁定到整個查詢的參數。
值得注意的是,它不像其他的查詢生成器方法,每次調用一個join方法都會追加到SQL中。
下面是一些例子:
// JOIN `tbl_profile` ON user_id=id join('tbl_profile', 'user_id=id') // LEFT JOIN `pub`.`tbl_profile` `p` ON p.user_id=id AND type=1 leftJoin('pub.tbl_profile p', 'p.user_id=id AND type=:type', array(':type'=>1))
function group($columns)
group() 方法指定查詢的GROUP BY。 $columns
參數指定列進行分組,它可以是一個用逗號分隔的列的字符串,或者一個列的數組。列名稱可以包含表前綴。該方法將自動引用列名,除非一列包含一些括號(即是一個 DB 表達式)。
下面是一些例子:
// GROUP BY `name`, `id` group('name, id') // GROUP BY `tbl_profile`.`name`, `id` group(array('tbl_profile.name', 'id'))
function having($conditions, $params=array())
having() 方法指定查詢的 HAVING。它的使用方式與 where() 相同。
下面是一些例子:
// HAVING id=1 or id=2 having('id=1 or id=2') // HAVING id=1 OR id=2 having(array('or', 'id=1', 'id=2'))
function union($sql)
union() 方法指定查詢 UNION。它使用UNION操作附加到現有的SQL上。調用union()多次將現有的SQL附加多個表。
下面是一些例子:
// UNION (select * from tbl_profile) union('select * from tbl_profile')
調用上面查詢生成器的方法來建立一個查詢後,我們可以調用DAO方法數據訪問對象執行查詢。例如,我們可以調用 CDbCommand::queryRow() 獲得連續的結果,或者使用 CDbCommand::queryAll() 立刻得到所有行。
例子:
$users = Yii::app()->db->createCommand() ->select('*') ->from('tbl_user') ->queryAll();
除了執行查詢生成器的查詢,我們也可以獲取相應的SQL語句。這可以通過調用 CDbCommand::getText() 獲得。
$sql = Yii::app()->db->createCommand() ->select('*') ->from('tbl_user') ->text;
如果有任何參數必須綁定到查詢的,他們可以通過 CDbCommand::params 的屬性綁定。
有時,使用方法鏈來建立一個查詢可能不是最佳的選擇。Yii的查詢生成器允許使用對簡單象屬性賦值的方式去建立查詢。特別是,每個查詢生成器的方法都有一個具有相同名稱的屬性。給屬性賦值相當於調用相應的方法。例如,下面兩個語句是等價的,假設$command
代表 CDbCommand 對象:
$command->select(array('id', 'username')); $command->select = array('id', 'username');
此外, CDbConnection::createCommand() 方法可以把一個數組作為參數。數組中的鍵值對將被用來初始化創建的 CDbCommand 實例的屬性。這意味著,我們可以使用下面的代碼來建立一個查詢:
$row = Yii::app()->db->createCommand(array( 'select' => array('id', 'username'), 'from' => 'tbl_user', 'where' => 'id=:id', 'params' => array(':id'=>1), ))->queryRow();
一個 CDbCommand 實例可以重復使用多次建立幾個查詢。建立一個新的查詢之前,需要調用 CDbCommand::reset() 方法以清理前面的查詢。例子:
$command = Yii::app()->db->createCommand(); $users = $command->select('*')->from('tbl_users')->queryAll(); $command->reset(); // clean up the previous query $posts = $command->select('*')->from('tbl_posts')->queryAll();
數據操作查詢是指SQL語句插入,更新和刪除數據庫表中的數據。對應於這些查詢,查詢生成器分別提供了插入,更新和刪除的方法。不同於上面介紹 SELECT 的查詢方法,這些數據操作查詢方法將建立一個完整的SQL語句,並立即執行。
下面描述了這些數據操作查詢方法。
function insert($table, $columns)
insert()方法的建立和執行一條 INSERT SQL 語句。 $table
參數指定要插入的表,而鍵值對數組 $columns
指定要插入的列的值。該方法將轉義表名,並且將與綁定參數結合使用。
下面是一個例子:
// build and execute the following SQL: // INSERT INTO `tbl_user` (`name`, `email`) VALUES (:name, :email) $command->insert('tbl_user', array( 'name'=>'Tester', 'email'=>'[email protected]', ));
function update($table, $columns, $conditions='', $params=array())
update()方法的建立和執行一個SQL更新語句。 $table
參數指定要更新的表; $columns
是鍵值對的數組,用於指定要更新的列值的;$conditions
和 $params
像where()一樣,指定 UPDATE 語句中的 WHERE 子句。該方法將轉義表名,並且將與要更新的值的參數結合使用。
下面是一個例子:
// build and execute the following SQL: // UPDATE `tbl_user` SET `name`=:name WHERE id=:id $command->update('tbl_user', array( 'name'=>'Tester', ), 'id=:id', array(':id'=>1));
function delete($table, $conditions='', $params=array())
delete()方法的建立和執行一個SQL刪除語句。 $table
參數指定要刪除數據的表;$conditions
和$params
像where()一樣,指定 DELETE
語句中的 WHERE 子句。該方法將正確轉義表名。
下面是一個例子:
// build and execute the following SQL: // DELETE FROM `tbl_user` WHERE id=:id $command->delete('tbl_user', 'id=:id', array(':id'=>1));
除了正常的數據檢索和操作查詢,查詢生成器提供了一套用於可以操縱數據庫的構建和執行SQL查詢的方法。它支持以下操作:
Info: 雖然在不同的數據庫管理系統中SQL語句操作數據庫的模式有很大的不同,但查詢生成器試圖提供一個統一的接口,用於構建這些查詢。這簡化了數據庫遷移從一個數據庫管理系統到另一個任務。
抽象數據類型 Abstract Data Types
查詢生成器中引入了一組可以在定義表的列中使用抽象數據類型。與物理數據類型不同,物理數據類型有具體獨特的DBMS而且在不同的DBMS中有很大的不同,抽象數據類型都是獨立的DBMS。當抽象數據類型在定義表的列中使用時,查詢生成器將其轉換成相應的物理數據類型。
下面的抽象數據類型由查詢生成器的支持。
pk
: 一個通用的主鍵類型,將被轉換成int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY
for MySQL;string
: 字符串類型,將被轉換成varchar(255)
for MySQL;text
: 文本型(長字符串),將被轉換成text
for MySQL;integer
: 整數類型,將被轉換成int(11)
for MySQL;float
: 浮點數類型,將被轉換成float
for MySQL;decimal
: 十進制數類型,將被轉換成decimal
for MySQL;datetime
: datetime類型,將被轉換成datetime
for MySQL;timestamp
: 時間戳類型,將被轉換成timestamp
for MySQL;time
: 時間類型,將被轉換成time
for MySQL;date
: 日期類型,將被轉換成date
for MySQL;binary
: 二進制數據類型,將被轉換成blob
for MySQL;boolean
: 布爾類型,將被轉換成tinyint(1)
for MySQL;money
: 金錢/貨幣型,將被轉換成decimal(19,4)
for MySQL. 自1.1.8版本開始此類型可以使用。createTable()
function createTable($table, $columns, $options=null)createTable() 方法構建和執行一條創建表的SQL語句。
$table
參數指定要創建的表的名稱。$columns
參數指定在新表中的列。他們必須被指定為名稱類型的鍵值對(e.g.'username'=>'string'
)。$options
參數指定應附加到生成的SQL上的任何額外的SQL片段。查詢生成器將正確的引用的表名以及列名。當指定一個列的定義時,可以使用如上所述的抽象數據類型。查詢生成器會根據當前使用的數據庫管理系統的抽象數據類型轉換成相應的物理數據類型。例如,string 類型將被轉換為MySQL的 varchar(255)。
一個列定義還可以包含非抽象數據類型或規格。他們將沒有任何改變的被放置在生成的SQL中。例如,
point
不是一個抽象數據類型,如果用在列定義,它會出現在生成的SQL中,而且string NOT NULL
將被轉換varchar(255) NOT NULL(即只有抽象類型的字符串轉換)。下面是一個例子,顯示了如何創建一個表:
// CREATE TABLE `tbl_user` ( // `id` int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY, // `username` varchar(255) NOT NULL, // `location` point // ) ENGINE=InnoDB createTable('tbl_user', array( 'id' => 'pk', 'username' => 'string NOT NULL', 'location' => 'point', ), 'ENGINE=InnoDB')renameTable()
function renameTable($table, $newName)renameTable() 方法創建和執行一條重命名表名的SQL語句。
$table 參數
指定要重命名的表的名稱。$newName
參數指定表的新名稱。查詢生成器將正確引用的表名。下面是一個示例,演示了如何重命名表:
// RENAME TABLE `tbl_users` TO `tbl_user` renameTable('tbl_users', 'tbl_user')dropTable()
function dropTable($table)dropTable() 方法創建和執行一條刪除表的SQL語句。在
$table
參數指定要刪除的表的名稱。查詢生成器會正確地引用的表名。下面是一個示例展示如何刪除一個表:
// DROP TABLE `tbl_user` dropTable('tbl_user')truncateTable()
function truncateTable($table)truncateTable() 方法建立和執行一條清空表數據的SQL語句。
$table 參數
指定清空的表名。查詢生成器會正確地引用的表名。下面是一個示例顯示如何清空表:
// TRUNCATE TABLE `tbl_user` truncateTable('tbl_user')addColumn()
function addColumn($table, $column, $type)addColumn() 方法創建並執行一條添加一個表的新列的SQL語句。
$table 參數
指定新列將被添加到的表的名稱。$column
參數指定新列的名稱。$type
指定新列的定義。列定義中可以包含抽象數據類型,如 "createTable"小節中的描述。查詢生成器將正確的引用的表名以及列名。下面是一個示例,演示如何添加一個表的列:
// ALTER TABLE `tbl_user` ADD `email` varchar(255) NOT NULL addColumn('tbl_user', 'email', 'string NOT NULL')dropColumn()
function dropColumn($table, $column)dropColumn() 方法創建和執行一條刪除表列的SQL語句。
$table 參數
指定要被刪除的列所屬的表名。$column
參數指定要被刪除的列名。查詢生成器將正確地引用的表名以及列名。下面是一個示例展示如何刪除一個表列:
// ALTER TABLE `tbl_user` DROP COLUMN `location` dropColumn('tbl_user', 'location')renameColumn()
function renameColumn($table, $name, $newName)renameColumn() 方法創建和執行一條重命名列的SQL語句。
$table 參數
指定要重命名的列所屬的表的名稱。$name
參數指定的舊列名。$newName
指定新的列名。查詢生成器將正確地引用的表名以及列名。下面是一個示例,展示了如何重命名表列:
// ALTER TABLE `tbl_users` CHANGE `name` `username` varchar(255) NOT NULL renameColumn('tbl_user', 'name', 'username')alterColumn()
function alterColumn($table, $column, $type)alterColumn() 方法創建和執行一條修改表列的SQL語句。
$table 參數
指定要被改變的列所屬的表的名稱。$column
參數指定被改變的列的名稱。$type
指定列的新定義。列定義中可以包含抽象數據類型,如 "createTable"小節中的描述。查詢生成器將正確的引用的表名以及列名。下面是一個示例,展示了如何更改一個表列:
// ALTER TABLE `tbl_user` CHANGE `username` `username` varchar(255) NOT NULL alterColumn('tbl_user', 'username', 'string NOT NULL')addForeignKey()
function addForeignKey($name, $table, $columns, $refTable, $refColumns, $delete=null, $update=null)addForeignKey() 方法創建和執行一條添加一個外鍵約束SQL語句。
$name
參數指定外鍵的名稱。$table
和$columns
參數指定外鍵的表名和列名。如果有多個列,他們應該用逗號字符分隔。$refTable
和$refColumns
參數指定表名和列名的外鍵引用。$delete
和$update
參數指定 SQL語句中的 ON DELETE 和ON UPDATE選項。大多數的DBMS都支持這些選項:RESTRICT
,CASCADE
,NO ACTION
,SET DEFAULT
,SET NULL
. 。查詢生成器會正確地引用表名,索引名和列名。下面是一個示例,演示如何添加一個外鍵約束:
// ALTER TABLE `tbl_profile` ADD CONSTRAINT `fk_profile_user_id` // FOREIGN KEY (`user_id`) REFERENCES `tbl_user` (`id`) // ON DELETE CASCADE ON UPDATE CASCADE addForeignKey('fk_profile_user_id', 'tbl_profile', 'user_id', 'tbl_user', 'id', 'CASCADE', 'CASCADE')dropForeignKey()
function dropForeignKey($name, $table)dropForeignKey() 方法創建和執行一條刪除一個外鍵約束的SQL語句。
$name
參數指定的要刪除的外鍵約束的名稱。$table
參數指定外鍵所屬的表的名稱。查詢生成器將正確地引用的表名以及約束名稱。下面是一個示例,顯示了如何刪除外鍵約束:
// ALTER TABLE `tbl_profile` DROP FOREIGN KEY `fk_profile_user_id` dropForeignKey('fk_profile_user_id', 'tbl_profile')createIndex()
function createIndex($name, $table, $column, $unique=false)createIndex() 方法構建和執行一條創建索引的SQL語句。
$name
參數指定要創建的索引的名稱。$table
參數指定索引所屬的表的名稱。$column
參數指定要索引的列的名稱。$unique 參數
指定是否創建一個唯一索引。如果索引由多個列,則必須用逗號將它們隔開。查詢生成器會正確地引用表名,索引名和列名。下面是一個示例,顯示了如何創建索引:
// CREATE INDEX `idx_username` ON `tbl_user` (`username`) createIndex('idx_username', 'tbl_user', 'username')dropIndex()
function dropIndex($name, $table)dropIndex() 方法創建和執行一條刪除索引的SQL語句。
$name
參數指定要刪除的索引的名稱。$table
參數指定索引所屬的表的名稱。查詢生成器將正確地引用的表名以及索引名稱。下面是一個示例,顯示了如何刪除索引:
// DROP INDEX `idx_username` ON `tbl_user` dropIndex('idx_username', 'tbl_user')終於翻譯完了~~~
如有錯誤或看不懂的地方,歡迎留言~~怎啟動報表生成器 (Report Builder 30)
ClickOnce 版本可用於本機模式或 SharePoint 集成模式下安裝的 Reporting Services。
注意Report Builder 3.0 不能安裝在基於 Itanium 64 的計算機中。這適用於 Report Builder 3.0 的 ClickOnce 和獨立版本。
若要在本機模式下啟動報表生成器 ClickOnce,您可單擊報表管理器中的
“報表生成器”
按鈕,也可以使用指定的 URL。
若要在 SharePoint 集成模式下啟動報表生成器,請單擊
“新建文檔”菜單上的“報表生成器報表”選項。
還可以使用報表生成器的 ClickOnce 版本來在已發布到 SharePoint 的 PowerPivot for Excel 工作簿上創建報表。有關將報表生成器用於 PowerPivot 的詳細信息,請參閱 technet.microsoft.com 上的
Create a Reporting Services Report with PowerPivot Data
(使用 PowerPivot 數據創建 Reporting Services 報表)。
在本地計算機上,從“開始”菜單啟動報表生成器獨立版本。與 ClickOnce 版本(從報表管理器或 SharePoint 庫啟動)相比,您或管理員必須直接在您的計算機上安裝報表生成器,然後您才能使用該工具。在安裝 SQL Server 2008 R2 時未安裝獨立版本;您必須單獨下載並安裝它。有關詳細信息,請參閱
yii查詢find
字符串需要加引號。
額,你去yii中文網站加群,在群裡面問,知道的回答效率有點低。