跳到主要內容

T-SQL 系統函數@ROWCOUNT的使用

在專案程式撰寫中,突然發現有一段預存程式怪怪的,因為他所產生出來的Exection 應該是不會發生的,但是卻出現了。程式是像這樣的

CREATE PROCEDURE UPDATE_TABLE1
@ParamKey VARCHAR(10)
,@ParamValue VARCHAR(20)
,@ParamDate DATETIME
AS
BEGIN

--更新TABLE1
UPDATE TABLE1
SET ColumnValue = @ParamValue
,ColumnDate = @ParamDate
WHERE ColumnKey = @ParamKey

--產生一串字
DECLARE @VarText VARCHAR(20)
SET @VarText = '這是示範資料' + ColumnValue

--前面的執行程序有影響1筆(含)以上的資料
--再新增資料到TABLE2
IF @@ROWCOUNT > 0
INSERT INTO TABLE2 (ColumnKey, ColumnText)
VALUES (@ParamKey, @VarText)
END
乍看之下好像沒什麼不對,但執行時卻會發生Excetion [INSERT 陳述式與 FOREIGN KEY 條件約束 "FK_TABLE2_ColumnKey" 衝突。衝突發生在資料庫 "DBTest",資料表 "dbo.TABLE1", column 'ColumnKey'。],其實這段語法隱藏了一個陷阱…



在TechNet中SQL Server的系統函數中有提到@@ROWCOUNT的使用,有幾個事情要注意:
1. 進行簡單指派的陳述式一律會將 @@ROWCOUNT 值設為 1。  它不會傳送任何資料列給用戶端。 以下是這些陳述式的範例:SET @local_variable、RETURN、READTEXT 以及 select without query 陳述式 (例如,SELECT GETDATE() 或 SELECT 'Generic Text')。
2. DECLARE CURSOR 和 FETCH 會將 @@ROWCOUNT 值設為 1。
3. EXECUTE 陳述式會保留前一個 @@ROWCOUNT。
4. 像 USE、SET <option>、DEALLOCATE CURSOR、CLOSE CURSOR、BEGIN TRANSACTION 或 COMMIT TRANSACTION 等陳述式,會將 ROWCOUNT 值重設為 0。
所以如果要用@@ROWCOUNT去判斷,記得這些規則,否則判斷就會不正確。


因此上面的語法只要修改成

CREATE PROCEDURE UPDATE_TABLE1
@ParamKey VARCHAR(10)
,@ParamValue VARCHAR(20)
,@ParamDate DATETIME
AS
BEGIN

--產生一串字
DECLARE @VarText VARCHAR(20)
SET @VarText = '這是示範資料' + ColumnValue

--更新TABLE1
UPDATE TABLE1
SET ColumnValue = @ParamValue
,ColumnDate = @ParamDate
WHERE ColumnKey = @ParamKey

--前面的執行程序有影響1筆(含)以上的資料
--再新增資料到TABLE2
IF @@ROWCOUNT > 0
INSERT INTO TABLE2 (ColumnKey, ColumnText)
VALUES (@ParamKey, @VarText)
END
就解決了

參考資料:
1. TechNet - @@ROWCOUNT (Transact-SQL):http://technet.microsoft.com/zh-tw/library/ms187316.aspx

留言

這個網誌中的熱門文章

以管理者權限執行批次檔

最近有個專案需要執行批次檔,來進行某些設定或者城市的安裝,在XP上這個Script可以運行沒問題,可是一到Vista以後的Windows版本就無法運行了,最主要的原因是,UAC的管制的問題,幾經尋找,總算找到一個可行的解決辦法。

如何使用電子發票應用API

財政部在電子發票推行上,為了方便開發更多應用所以提供了API可供個人或者廠商進行相關應用的開發,申請的方式請參考 –> 電子發票API申請 最簡單的申請方式就是透過自然人憑證或者工商憑證申請,這樣就不需要檢附任何證明文件。不過這不是本篇的重點,當申請到時會給你一組AppID跟APIKey,然後你可以下載 電子發票應用規格1.4版 來了解怎樣使用這個API,或許是我才疏學淺,所以在1.3版的時候其實搞不太懂他的API文件,到了1.4版才摸清楚發生了什麼事,當然還是花了點時間才搞懂,現在就簡單說明一下API的使用方式,希望看到本篇文章的同好就不需要花時間測試了。

DataGridView欄位統一格式化

最近的工作內有一個需求,就是由於專案中有許多呈現資料的DataGridView,而其中的欄位需要呈現的包含金額、數字或者日期等格式,若要一個個的設定格式,如果有一天格式突然變更,可能就要苦工做到死,如何讓專案中的這些格式都統一就成了一個問題,經過了一番查找,發現可以透過DataGridView.CellFormatting Event來解決這個問題。