2013-05-04

2013-04-17

判斷資料表中特定欄位是否存在


於MS SQL資料庫中可使用sys.sysobjects查詢資料表是否存在,
而sys.columns則可查詢資料表中欄位資訊,
--檢查特定資料表是否存在
select OBJECT_ID('Prod')
--或
select * from sys.sysobjects where id=OBJECT_ID('Prod')
--檢查特定資料表中特定欄位是否存在
select * from sys.syscolumns where id=OBJECT_ID('Prod') and name='ProdNo'
如果是要查詢暫存表中的相關資訊,作法如下
--檢查特定暫存資料表是否存在
select OBJECT_ID('tempdb..#Prod')
--或
select * from tempdb..sysobjects where id=OBJECT_ID('tempdb..#Prod')
--檢查特定暫存資料表中特定欄位是否存在
select * from tempdb..syscolumns where id=OBJECT_ID('tempdb..#Prod') and name='ProdNo'

2013-04-07

變更tempdb存放位置

MS SQL Server無法透過Miscorsoft SQL Server Management Studio
修改伺服器中的tempdb的存放位置,
可以透過下述語法達到變更需求

--查詢tempdb存放位置
USE master
SELECT name,physical_name
FROM sys.master_files
WHERE database_id=DB_ID('tempdb')

--修改tempdb存放位置
USE master;
ALTER DATABASE tempdb
MODIFY FILE (NAME=tempdev,FILENAME='X:\tempdb.mdf');
ALTER DATABASE tempdb
MODIFY FILE (NAME=templog,FILENAME='X:\templog.ldf');

2013-02-13

INSERT EXEC 陳述式不可以是巢狀的

最近編寫stored procedure發生
「INSERT EXEC 陳述式不可以是巢狀的」的錯誤訊息,
主因是因為procedure內使用exec將結果寫入tempdb,
又將procedure回傳的結果又寫入tempdb中,
於MS SQL中視為Nested Insert Exec,所以禁止此操作,
解決方法可使用新增本機linkedserver的方式處理。

2013-01-19

GROUPING 回傳是否為GROUP BY彙總資料行

延續前一篇group by 群組小計,
可搭配GROUPING使用,區分是否為匯總資料行。
DECLARE @TABLE TABLE (Pname VARCHAR(10),
   SW  VARCHAR(10),
   Qty SMALLINT)
INSERT INTO @TABLE VALUES ('AA','1',50)
INSERT INTO @TABLE VALUES ('AA','2',70)
INSERT INTO @TABLE VALUES ('AA','2',35)
INSERT INTO @TABLE VALUES ('AA','3',36)
INSERT INTO @TABLE VALUES ('BB','1',25)
INSERT INTO @TABLE VALUES ('BB','2',10)
INSERT INTO @TABLE VALUES ('BB','2',20)

SELECT Pname,SW,Qty=SUM(Qty),GP=GROUPING(Pname)
FROM @TABLE
GROUP BY Pname,SW WITH ROLLUP
--查詢結果
Pname      SW         Qty         GP
---------- ---------- ----------- ----
AA         1          50          0
AA         2          105         0
AA         3          36          0
AA         NULL       191         0
BB         1          25          0
BB         2          30          0
BB         NULL       55          0
NULL       NULL       246         1
參考自:MSDN-GROUPING (Transact-SQL)

2012-10-20

Google Doc-Excel跨工作簿資料抓取

於Google Doc內的Excel想要讀取不同檔案的做表資料,
可以透過 ImportRange 函式,將資料轉入,

=ImportRange("參照工作簿key","資料範圍")

1.參照工作簿Key抓取方式如下圖,
僅複製key=後至#gid間字串即可,
2.於ImportRange第二個參數輸入要讀取的資料範圍即可!

範例:=ImportRange("0AplU-NopnRmHdFhlWW1WWnRzb01lYmxPMURkYl9RMnc","產品主檔!A:G")

參考自:Google 文件 說明



2012-09-19

SQLite 時間處理問題

在Delphi中透過ADO元件使用SQLite資料庫時,
抓取時間的資料格式如下
select datetime(CURRENT_TIMESTAMP,'localtime')
-------------------
2012-09-19 23:29:45
若將抓取的時間資料透過ADOQuery寫入,
會出現 is not a valid date and time 的錯誤訊息,
這是因為在台灣的時間格式 年、月、日 以"/"區隔而非"-",
故會產生時間格式錯誤的訊息,
使用下列語法指定輸出的時間格式,即可避免此問題
select strftime('%Y/%m/%d %H:%M:%f',datetime(CURRENT_TIMESTAMP,'localtime'))
-------------------
2012/09/19 23:29:45

時間格式:
%d - 月份內的日期
%f - 秒數 (準確至千份一秒)
%H - 小時
%j - 年份內的第幾日 (沒有潤年最大 365, 潤年最大 366)
%m - 月份
%M - 分鐘
%s - Unix Time Stamp
%w - 星期 (0 是星期日,6 是星期六)
%W - 年份內的第幾個星期
%Y - 年份
%% - 顯示 % 時使用

參考自
Programming Design Notes-SQLite 日期和時間的操作

2012-08-28

以COALESCE()取代ISNULL()

在德瑞克大的Blog看到一篇認識 COALESCE() 函數文章,
特別記錄一下,供以後自己參考!

一般我們使用ISNULL()會傳入兩個參數,
當第一個參數為NULL時,則會回傳第二個參數的值,
而COALESCE()不同於ISNULL(),在於可以傳入多個參數,
一直到第一個非NULL值的參數出現才回傳,
利用這個特性,也可以簡化當我們使用ISNULL()與CASE WHEN的搭配!!

2012-08-24

使用 @@ROWCOUNT 抓取受影響資料筆數

MS SQL Server中提供@@ROWCOUNT函數,
可回傳上一個SQL語法影響的資料筆數,
利用此函數可以讓我們在編寫T-SQL語法時,
減少反覆利用select判斷資料次數,以增進效能!

SET NOCOUNT ON

DELETE FROM ExaRec
WHERE CorpNo='20001' AND PrgType='MATV16'

SELECT '刪除資料筆數-'+CONVERT(VARCHAR,@@ROWCOUNT)
----------------------
刪除資料筆數-4

參考自: