在我的表中,我有兩列
ClosedDate DateTime null
IsClosed bit null
如果@IsClosed的輸入值是真實的當前值IsClosednull或假的話,我想更新的價值ClosedDate要GetDate()這樣
ClosedDate = GETDATE()
這是我嘗試過但不起作用的方法。
ALTER PROCEDURE[dbo].someProcedure
@IsClosed bit,
Update dbo.Foo
SET
//Other fields to be set
ClosedDate = CASE WHEN IsClosed = 0 OR IsClosed = NULL AND IsClosed <> @IsClosed THEN GETDATE() END,
IsClosed = @IsClosed
WHERE myId = @myId
我哪里錯了?
uj5u.com熱心網友回復:
CloseDate如果不能改變則設定為自身,否則設定為 NULL。
UPDATE dbo.Foo
SET
ClosedDate = CASE WHEN ISNULL(IsClosed, 0) = 0 AND IsClosed <> @IsClosed
THEN GETDATE()
ELSE ClosedDate
END,
IsClosed = @IsClosed
WHERE myId = @myId
請注意,如果您只設定一列,或者如果兩列必須一起更新或不一起更新,您只需將所有條件添加到 WHERE 子句中。
UPDATE dbo.Foo
SET
ClosedDate = GETDATE()
IsClosed = @IsClosed
WHERE
myId = @myId AND
ISNULL(IsClosed, 0) = 0 AND
IsClosed <> @IsClosed
另外,不要測驗IsClosed = 0 OR IsClosed = NULL。由于 NULL 傳播,這不會按預期作業。ISNULL(IsClosed, 0) = 0改為使用或COALESCE(IsClosed, 0) = 0(我不確定 SQL-Server 2008 是否已經知道 ISNULL)。
uj5u.com熱心網友回復:
這里的一個問題是@IsClosed(輸入)是0并且IsClosed(列)是 的情況NULL。現有的@IsClosed <> IsClosed可能會產生意想不到的結果。
這應該做你需要的:
ALTER PROCEDURE[dbo].someProcedure
@IsClosed bit, @MyId int
AS
Update dbo.Foo
SET
ClosedDate = current_timestamp
IsClosed = @IsClosed
WHERE myId = @myId AND COALESCE(IsCosed,0) = 0 and @IsClosed = 1
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/358331.html
標籤:sql-server 存储过程
