2012-02-24 97 views
1

編輯:好的我想通了,我有一個if語句必須返回true才能運行SQL,這就是問題所在。我的SQL沒有錯。抱歉!SQL語句不更新任何行

我不知道這條語句有什麼問題,但它不會更新任何行。

IF EXISTS (
    SELECT * 
    FROM dtRaces 
    WHERE 
     Date = @date 
    AND Location = @location 
    AND Time = @time 
) 
    UPDATE dtRaces SET 
    [email protected], 
    [email protected], 
    [email protected] 
    [email protected], 
    [email protected], 
    [email protected] 
    WHERE 
     Date = @date 
    AND Location = @location 
    AND Time = @time 
ELSE 
    INSERT INTO dtRaces (Date, Location, Time, City, State, Title) 
    VALUES (@date, @location, @time, @city, @state, @title) 

任何想法?我很難過。 這是SQL Server 2008,但我還沒有學會如何使用MERGE。

+0

它會插入但不更新? – dasblinkenlight 2012-02-24 11:19:55

+2

「如果這些值存在行,請更新這些行以使其具有完全相同的值。」你沒有看到這個問題? – 2012-02-24 11:19:59

+0

@AnthonyGrist - 是的,不完全確定OP在這裏試圖做什麼。也許更新應該更新城市,州和標題領域,或者呢? – MatBailie 2012-02-24 11:25:31

回答

0

如果該行存在,您正在將行更新爲相同的值。所以 - 它看起來像什麼也沒有發生。

如果創建更新後觸發 - 你一定會看到它的運行

PS:總體行爲是有點怪。

編輯:

現在它看起來更好,但你仍然沒有需要更新一些值,以相同的價值觀,看到這一點:

IF EXISTS (
    SELECT * 
    FROM dtRaces 
    WHERE 
     Date = @date 
    AND Location = @location 
    AND Time = @time 
) 
    UPDATE dtRaces SET 
    [email protected], 
    [email protected], 
    [email protected] 
    WHERE 
     Date = @date 
    AND Location = @location 
    AND Time = @time 
ELSE 
    INSERT INTO dtRaces (Date, Location, Time, City, State, Title) 
    VALUES (@date, @location, @time, @city, @state, @title) 

對於使用合併你有保證,這三列總是獨一無二的:日期,時間,地點。如果是的話 - 的MERGE看起來就像這樣:

MERGE dtRaces T 
USING (SELECT 1 S) S 
ON T.Date = @date AND T.Location = @location AND Time = @time 
WHEN MATCHED THEN UPDATE SET 
    [email protected], 
    [email protected], 
    [email protected] 
WHEN NOT MATCHED THEN 
    INSERT (Date, Location, Time, City, State, Title) 
    VALUES (@date, @location, @time, @city, @state, @title); 

PS:如果你的變量(@date,@time,@location)中的一個具有NULL的價值 - 你也將永遠不會得到更新。

+0

對不起,我原來的帖子被編輯和不正確的更改。現在已經修復在UPDATE語句中包含其他值。 – user1230593 2012-02-24 20:24:10

+0

編輯:好的我想通了,我有一個if語句必須返回true才能運行SQL,這就是問題所在。我的SQL沒有錯。抱歉! – user1230593 2012-02-24 20:45:55

+0

已更新的答案。也看到最後一個PS。 – 2012-02-24 20:49:13

1

我建議你比較這些值。

開始

IF EXISTS (SELECT * FROM dtRaces WHERE Date = @date AND Location = @location AND Time = @time) 
begin 
print('exists') 
end 
else 
begin 
print('insert') 
end 

您可以更改打印語句來選擇信息和進行比較。

+0

@OlegDok - 答案並不是說它們在邏輯上是不同的,只是有一個非常小的性能差異。據我回憶,實際上可能是真的,由於發動機內部的原因,網上有很多關於它的討論。但它是無形的,它使*幾乎*無*察覺*差異。我不知道你是如何證明-1的。特別是考慮到它可能在技術上是正確的。 – MatBailie 2012-02-24 11:28:20

+0

我刪除了有關select 1而不是select *的聲明,因爲它引起爭議,並且是在我上次測試它之前的幾年前。 – Johan 2012-02-24 11:29:14

+0

@Dems - 據我所知 - Sql Server在EXISTS子句中根本不考慮列列表。所以 - 即使是微小的技術性能差異也沒有。你可以通過拒絕訪問某列到特定用戶來檢查它,並讓這個用戶使用SELECT * - 不會有安全錯誤,相反如果你做簡單的選擇* - 將會有一個\ – 2012-02-24 11:31:44

3

你已經得到了聲明:

UPDATE dtRaces SET 
    [email protected], 
    [email protected], 
    [email protected] 
    WHERE 
     Date = @date 
    AND Location = @location 
    AND Time = @time 

這是更新的列有值,但只有在他們已經有這樣的價值觀 - 你永遠不會看到從該更新的數據。

+0

對不起,我原來的帖子被編輯和不正確的更改。現在已經修復在UPDATE語句中包含其他值。 – user1230593 2012-02-24 20:23:36

+0

編輯:好的我想通了,我有一個if語句必須返回true才能運行SQL,這就是問題所在。我的SQL沒有錯。抱歉! – user1230593 2012-02-24 20:45:16

+0

@ user1230593:是的,它必須返回true。說過你的代碼中的'EXISTS'應該沒問題。 – 2012-02-24 22:17:36

0

好的我想通了,我有一個if語句必須返回true才能運行SQL,這就是問題所在。我的SQL沒有錯。抱歉!