顯示具有 MSSQL 標籤的文章。 顯示所有文章
顯示具有 MSSQL 標籤的文章。 顯示所有文章

2015年3月19日 星期四

[mysql] 之於MSSQL XML PATH

在MSSQL中,要合併多筆資料到同一個欄位

可以用 XML PATH來實現

SELECT T1.id, T1.type
          ,(SELECT [DESC] + ''
          FROM   @TABLE AS T2
          WHERE  T2.id = T1.id  FOR XML PATH('')) AS [DESC]
FROM @TABLE AS T1
GROUP BY id, type


而在MYSQL中,可以用GROUP_CONCAT來實現

SELECT date_format(T.T1,'%Y%m') AS d
              ,GROUP_CONCAT(T.ID) AS id
FROM @TABLE AS T
GROUP BY date_format(T.T1,'%Y%m')

2015年3月17日 星期二

[php] CI 同時連MSSQL與MYSQL

在\application\config\database.php裡加上

$db['default']['hostname'] = 'SQL伺服器名稱';
$db['default']['username'] = '使用者名稱';
$db['default']['password'] = '使用者密碼';
$db['default']['database'] = '資料庫名稱';
$db['default']['dbdriver'] = 'mysql';
$db['default']['dbprefix'] = '';
$db['default']['pconnect'] = TRUE;
$db['default']['db_debug'] = TRUE;
$db['default']['cache_on'] = FALSE;
$db['default']['cachedir'] = '';
$db['default']['char_set'] = 'utf8';
$db['default']['dbcollat'] = 'utf8_general_ci';
$db['default']['swap_pre'] = '';
$db['default']['autoinit'] = TRUE;
$db['default']['stricton'] = FALSE;

$db['default']['hostname'] = 'SQL伺服器名稱';
$db['default']['username'] = '使用者名稱';
$db['default']['password'] = '使用者密碼';
$db['default']['database'] = '資料庫名稱';
$db['default']['dbdriver'] = 'sqlsrv';
$db['default']['dbprefix'] = '';
$db['default']['pconnect'] = TRUE;
$db['default']['db_debug'] = TRUE;
$db['default']['cache_on'] = FALSE;
$db['default']['cachedir'] = '';
$db['default']['char_set'] = 'utf8';
$db['default']['dbcollat'] = 'utf8_general_ci';
$db['default']['swap_pre'] = '';
$db['default']['autoinit'] = TRUE;
$db['default']['stricton'] = FALSE;

怎麼連接MSSQL請看[php]CI 連接 MSSQL(使用apache)

第一個為預設
$this->load->database();

第二個就要改成
$this->load->database("資料庫名稱",TURE);

接下來

在你要轉換資料庫的語法上面加
$this->msdb= $this->load->database('資料庫名稱', TRUE);
$this->msdb->query('SELECT top 10 * FROM test_db')->result();

原本的就
$this->load->database();
$this->db->query('SELECT top 10 * FROM test_db')->result();

[php]CI 連接 MSSQL(使用apache)

還是要抱怨一下!
都換PHP了,竟然還要連MSSQL

在網路上試了幾個方法
最後終於成功啦!!

先去微軟官網,依照你的php版本,下載不同的Drivers
Microsoft Drivers for PHP for SQL Server

再去微軟官網,下載
Microsoft® ODBC Driver 11 for SQL Server® - Windows

修改\php\php.ini

把原本的
;extension=php_mssql.dll
改成
extension=php_pdo_sqlsrv_XXXXX.dll
extension=php_sqlsrv_XXXXX.dll

也可以不修改它,直接增加這兩行
修改得話,記得前面的";"號要拿掉,這是註解的意思

再把
mssql.secure_connection = On  <=Off 改成On

Apache 重啟!很重要!,但我只說一遍!


接下來換CI的config設定

\application\config\database.php

$db['default']['hostname'] = 'SQL伺服器名稱';
$db['default']['username'] = '使用者名稱';
$db['default']['password'] = '使用者密碼';
$db['default']['database'] = '資料庫名稱';
$db['default']['dbdriver'] = 'sqlsrv';
$db['default']['dbprefix'] = '';
$db['default']['pconnect'] = TRUE; -> FALSE
$db['default']['db_debug'] = TRUE;
$db['default']['cache_on'] = FALSE;
$db['default']['cachedir'] = '';
$db['default']['char_set'] = 'utf8';
$db['default']['dbcollat'] = 'utf8_general_ci';
$db['default']['swap_pre'] = '';
$db['default']['autoinit'] = TRUE;
$db['default']['stricton'] = FALSE;

如果
$db['default']['pconnect'] = TRUE;

不做修改的話
需修改
\system\database\drivers\sqlsrv\sqlsrv_driver.php

function db_pconnect()
{
retrun $this->db_connect(TRUE);
}


同一個檔案,一定要修改的
function affected_rows()
{
return @sqlsrv_rows_affected($this->conn_id);
}


這樣就OK啦!

2015年1月16日 星期五

64-BIT SQL 查詢 32-BIT SQL 2000 LINKED SERVER錯誤(MSG 7311)

在64-bit 的SQL 用戶端對32-bit 的SQL 2000 或SQL 7.0的linked server作查詢時,會有如以下的錯誤訊息:
OLE DB provider "SQLNCLI10" for linked server "XXXXX" returned message "Unspecified error". OLE DB provider "SQLNCLI10" for linked server "XXXXX" returned message "The stored procedure required to complete this operation could not be found on the server. Please contact your system administrator.". Msg 7311, Level 16, State 2, Line 1 Cannot obtain the schema rowset "DBSCHEMA_TABLES_INFO" for OLE DB provider "SQLNCLI10" for linked server "XXXXX". The provider supports the interface, but returns a failure code when it is used.

一般解法為:
解法是32-bit的SQL 2000或SQL 7.0需升級SP3或SP4,
並手動執行附在SP3及SP4裡的nstcat.sql升級stored procedure
(預設路徑C:\Program Files\Microsoft SQL Server\MSSQL\Install)。

小弟查到的解法為:

從64位元的SSMS去Query 32位元的Linked server時,會回傳錯誤。
但昨天意外發現Open Query可以避掉這個error.

Select * From OPENQUERY(LinkedServerName,'select * from XXXXX')

2014年11月13日 星期四

MSSQL 到 MYSQL

MSSQL MYSQL
都是SQL DATABASE
只要會 SQL 語法 (insert, update, delete, select) 就可以執行基本的資料庫操作
不過使用起來還是有些微差距:

1.    CREATE

MSSQL

MYSQL


從上下兩張圖MSSQL=>MYSQL,我們可以看出:
(1)   拿掉 [dbo]
(2)   [ ] ` `` 符號是 TAB鍵上面那個 ~ 鍵,不是單引號
(3)   IDENTITY(1,1) AUTO_INCREMENT
(4)   nvarchar varchar
(5)   UNIQUE的用法跟位置 PRIMARY KEY 一樣
(6)   FOREIGN KEY 用法些許不同
(7)   CHECK (TEST_id > 0) 用法與位置跟 PRIMARY KEY 一樣
(8)   如果在MSSQL有用 numeric 型別,請更改為 integer
(9)   Unix 版本的 MySQL table 有大小寫區分,為避免困擾,建議 table 名稱小寫




2.    常見語法

在語法方面,幾乎是一樣的。
SELECTDISTINCTWHERE
SELECT DISTINCT column_name,column_name
FROM table_name
WHERE column_name operator value;

ORDER BY
SELECT column_name,column_name
FROM table_name
ORDER BY column_name,column_name ASC|DESC;

INSERT INTO
INSERT INTO table_name
VALUES (value1,value2,value3,...);
and
INSERT INTO table_name (column1,column2,column3,...)
VALUES (value1,value2,value3,...);

UPDATE
UPDATE table_name
SET column1=value1,column2=value2,...
WHERE some_column=some_value;

DELETE
DELETE FROM table_name
WHERE some_column=some_value;




語法順序
SELECT  -- 想要查詢的欄位     |
FROM    -- 想要查詢的表格     |
WHERE   -- 查詢條件         
GROUP BY-- 分組設定          
HAVING  -- 分組條件          |
ORDER BY-- 排序設定          |
LIMIT   -- 限制設定          V
上到下,順序是不可變的

就算你每一個子句的寫法都沒有出錯,如果順序不對了:
EX1
SELECT DISTINCT column_name,column_name
WHERE column_name operator value;
FROM table_name
EX2
SELECT DISTINCT column_name,column_name
FROM table_name
LIMIT 1
WHERE column_name operator value;
以上兩個執行起來都是會錯誤的。

數學運算
優先順序
運算子
說明
範例
運算結果
1
%
餘數
7 % 3
1
1
MOD
餘數
7 MOD 3
1
1
*
7 * 3
21
1
/
7 / 3
2.333
1
DIV
(整數)
7 DIV 3
2
2
+
7 + 3
10
2
-
7 – 3
4






3.    取前幾筆

MSSQL


MYSQL

兩者最大差異,就在一個用TOP,一個用LIMIT

MYSQL取區間,比MSSQL好一點是,可以直接在 LIMIT做應用

EX
46筆,LIMIT 3,3 ,從第三筆 + 1 筆開始取三筆資料




4.    註解

MSSQL


MYSQL


(1)   MSSQL 註解只有 -- 來表示
(2)   MYSQL 註解有四種方式
‘-- ,sort’ 這註解持續到行尾
-- MSSQL一樣,但 -- 接註解文字中間需要空格 “-- 註解
‘#,create_date’ 這註解持續到行尾
/*這是一行註解*/
/*

這是
多行註解

*/

5.    型態
參考

6.    Stored Procedure
MYSQL 5.0後新增了這個功能
CREATE PROCEDURE 名稱(變數) 來建立PROCEDURE
MySQL每條語句的末尾,都要加上分號“;

EX1

建立完後,使用方式為:
CALL test(3,5) ,即時沒有參數呼叫時也要加 CALL test() 括號

PROCEDURE的變數除了型態設定外,還有三種應用方式:
IN:「輸入、input」用的參數。這種參數與functions中的參數完全一樣,在呼叫procedures時傳送資料給procedures用的

OUT:「輸出、output」用的參數。在呼叫procedures時,不能接收傳送的資料,不過在執行procedures時,可以設定這類參數的值,新的值在執行完成後,可以回傳給呼叫的地方使用

INOUT:「輸入與輸出、inputoutput」用的參數。同時具有「IN」與「OUT」兩種用途

EX2

上圖紅框處可以看到,三種應用方式。
呼叫方式為:
SET @DDDD = 1;
CALL test(1,3,@AAAA,@DDDD);
SELECT @AAAA,@DDDD
結果為@AAAA=3,@DDDD=0

第一個與第二個變數為IN,需要輸入值
第三個變數為OUT,需用變數去接
第四個有INOUT,所以變數可設定值帶入。




7.    Stored Function
CREATE FUNCTION 名稱(變數) 來建立FUNCTION
RETURNS (回傳型態)」與「RETURN (回傳值)」兩個是FUNCTION的關鍵字
MySQL每條語句的末尾,都要加上分號“;

EX1

建立完後,使用方式為:
SELECT test('AAA')

EX2

紅框框內的變數名稱 var1 不能與欄位名稱 content 一樣,
content = content 這樣是會錯誤的。


8.    VIEW的應用


建立完,使用方式為:
SELECT * FROM view_test

上圖紅框框內,可自行修改需要的資料。



9.    MYSQL 排程(事件)

建成一個從”2014-11-13 19:14:00”開始每天執行一次的排程
通常在MYSQL的工具裡都有介面可以建立
不用自己在寫CREATE


需要修改的話,把CREATE改成ALTER即可。