三月 13

要知道前端下了什麼SQL到DB,在SQL Server中你可以使用SQL Server Profiler這個工作來達成。

但是在MySQL / MariaDB中目前似乎沒有一個好用的介面可以使用,

Oracle MySQL Enterprise Monitor 應該可以做到,但是授權商業使用的就是要錢,而且還不便宜,

官方定價,要使用Oracle MySQL Enterprise Monitor 最低消費,請付 USD 5000,價格請見 http://www.mysql.com/products/

這價錢不是一般小公司玩的起的,所以只能先用比較陽春的方法來解決了。

要在 MySQL / MariaDB 中啟用SQL Query Log的功能,有以下2種方法:

  1. 把Log寫入檔案。
  2. 把Log寫入資料庫中的Table。

繼續閱讀… »





十一月 01

如果你是用SQL Dumper(黑暗執行緒:好用的SQL Dumper)來匯出SQL Server的資料,當你要匯入時
可能你會遇到 .sql 檔的檔案太大,SQL Server Management Studio 開不起來
或是開起來後,執行很慢
這時候我們就需要使用sqlcmd來幫我們執行指令,較不吃資源
使用方式為開始 –> 執行 –> cmd

C:\Program Files\Microsoft SQL Server\90\Tools\Binn>sqlcmd -S 資料庫的IP -U 使用者名稱 -d 資料庫名稱 -i “C:\Documents and Settings\Administrator\SQLFile\SQL1.sql"

如此就可以執行匯入了,如果還需要更詳細的資訊可以使用sqlcmd -? 這個指令

C:\Program Files\Microsoft SQL Server\90\Tools\Binn>sqlcmd -?
Microsoft (R) SQL Server 命令列工具
版本 9.00.4035.00 NT INTEL X86
Copyright (c) Microsoft Corporation. All rights reserved.

使用方式: Sqlcmd                [-U 登入識別碼]         [-P 密碼]
[-S 伺服器]           [-H 主機名稱]           [-E 信任連接]
[-d 使用資料庫名稱]   [-l 登入逾時]           [-t 查詢逾時]
[-h 標頭]             [-s 資料行分隔符號]     [-w 螢幕寬度]
[-a 封包大小]         [-e 回應輸入]           [-I 啟用引號識別碼]
[-c 命令結束]         [-L 列出伺服器[清除輸出]]
[-q “命令行查詢"]             [-Q “命令行查詢" 並結束]
[-m 錯誤層次]         [-V 嚴重性層級]         [-W 移除句尾空格]
[-u unicode 輸出]             [-r[0|1] 訊息傳至 stderr]
[-i 輸入檔]           [-o 輸出檔]             [-z 新密碼]
[-f <字碼頁> | i:<字碼頁>[,o:<字碼頁>]]               [-Z 新密碼並結束]
[-k[1|2] 移除[取代] 控制字元]
[-y 可變長度類型顯示寬度]
[-Y 固定長度類型顯示寬度]
[-p[1] 列印統計資料[冒號格式]]
[-R 使用用戶端地區設定]
[-b 發生錯誤時中止批次]
[-v var = “值"…]  [-A 專用管理員連接]
[-X[1] 停用命令, 啟動指令碼, 環境變數 [並結束]]
[-x 停用變數替代]
[-? 顯示語法摘要]





七月 20

在SQL Server 2005中建View時如果你是用介面幫你產生的

應該會是像下面的指令碼一樣


SELECT     TOP (100) PERCENT MsgText
FROM         dbo.RouterOS_All
ORDER BY MsgDateTime DESC

當View建好了,也存檔了之後,再把View開起來

你會發現其實這個View並沒有依照我們的意思Order by

而解決問題的方法就是不要使用PERCENT,改用一個數值很大的值


SELECT     TOP (2147483647) MsgText
FROM         dbo.RouterOS_All
ORDER BY MsgDateTime DESC

這樣子就正常了。至於這是不是個Bug,我想就只能問MS了

測試環境:
SQL Server 2005 Express with SP3
Windows 2008 Std with SP1 x86

參考資料:
SQL Server 2005 Ordered View and Inline Function Problems





四月 13

通常我們要更改 SQL Server 資料表中的欄位屬性時

直接使用 SQL Server Management Studio 進去調整就行了

但是今天同事碰到一個問題,就是當改完屬性(大小)要存檔時,會發生連線逾時的情況

個人猜測是裡面的資料量很多,而你修改欄位的屬性(大小)時

SQL Server 會每一筆都去看一次,而造成連線逾時

解決的方法就是使用下 SQL 指令的方式去修改

語法如下


alter table table_name alter column col_name col_type

--範例。把"採購明細檔"裡的"品名"改為 nvarchar(50)

alter table 採購明細檔 alter column 品名 nvarchar(50)

--範例。把"採購明細檔"裡的"備註"改為 ntext

alter table 採購明細檔 alter column 備註 ntext

加大欄位的大小是沒問題的

但如果要縮小欄位請注意是否當前的資料是否小於你要調整的大小

如果現有的欄位資料大於你要調整的大小會發生以下情況,指令不會被執行

訊息 8152,層級 16,狀態 13,行 1
字串或二進位資料會被截斷。

陳述式已經結束。





二月 20

先切到該資料庫下面

Use DBName

然後下這串指令,會把View與Table都顯示出來


SELECT * FROM INFORMATION_SCHEMA.TABLES

如果只要抓取Table


SELECT * FROM INFORMATION_SCHEMA.TABLES
WHERE (TABLE_TYPE = 'BASE TABLE') 
AND (TABLE_SCHEMA = 'dbo')

如果只要抓取View


SELECT * FROM INFORMATION_SCHEMA.TABLES
WHERE (TABLE_TYPE = 'VIEW') 
AND (TABLE_SCHEMA = 'dbo')





二月 18

Union 這個運算式可以把多個 Select 指令出來的東西合成1張表

Select * From Table1
Union
Select * From Table2

這樣子就可以Table1與Table2中不重覆的資料合成一張表

如果連重覆的資料也要一起來的話就使用Union All

Select * From Table1
Union All
Select * From Table2

這樣子Table1與Table2中如果有重覆的資料也會一起出現

問題來了,如果我要把資料表中內含有 Image 格式欄位 Union 起來呢?

如果你直接下 Union 得話,就會得到下面的錯誤

訊息 421,層級 16,狀態 1,行 1
不能選取 image 資料類型作為 DISTINCT,因為無法比較。

用 Union All 的話又會得到重覆的資料

解決方法就是使用Union All,但是在Union All 前把重覆的資料篩就行了


Select * From Table1
Where KeyId Not In (Select KeyId From Table2)
Union All
Select * From Table2
Where KeyId Not In (Select KeyId From Table1)

這樣子就可以得到一個沒有重覆資料且有含 Image 格式欄位的資料表了