2013-03-11 105 views
2

我試圖在單個表中調整夏令時的多行。我需要在發現錯誤之前將任何記錄添加一小時。我得到錯誤子查詢返回多個值:DateTime

Subquery returns more than 1 value. This is not permitted when the subquery follows =, != etc 

我明白它告訴我什麼,我只是想不出一個辦法。這是我想要做的:

UPDATE Table 
SET LocalDateTime = LocalDateTime + '1:00:00' 
WHERE (DateWritten > '3/10/13') AND (DateWritten < '3/11/13 7:00:00') AND (varCharColumn <> 'aString') 

我也嘗試了變化,並收到相同的錯誤。

UPDATE Table 
SET LocalDateTime = LocalDateTime + '1:00:00' 
WHERE DateWritten IN (SELECT DateWritten FROM Table WHERE (same clause as above)) 
+1

您在第一條語句中出現子查詢錯誤?甚至沒有一個子查詢。 – 2013-03-11 14:03:58

回答

5

你最有可能在被寫入的方式,它不能處理多行更新該表中的觸發器。如果是這種情況,請修復觸發器,或使用光標進行更新。

另外,正如其他人所說的,您不能使用+運算符進行時間計算。改爲使用DATEADD


只是爲了澄清:您的更新不會導致您收到的錯誤。最可能的原因是由其他人實施的觸發器。你可以在表格下看到SSMS中的觸發器。看看你是否有觸發器,併發布代碼,如果你這樣做。也許我們可以幫助解決它。

如果你不想與觸發爛攤子,現在,使用光標這樣的:

DECLARE complex_cursor CURSOR FOR 
    SELECT LocalDateTime 
    FROM dbo.Table 
    WHERE (DateWritten > '3/10/13') AND (DateWritten < '3/11/13 7:00:00') AND (varCharColumn <> 'aString') ; 
OPEN complex_cursor; 
FETCH FROM complex_cursor; 
WHILE(@@FETCH_STATUS = 0) 
BEGIN 
    UPDATE dbo.Table 
    SET LocalDateTime = DATEADD(hour,1,LocalDateTime) 
    WHERE CURRENT OF complex_cursor; 

    FETCH FROM complex_cursor; 
END 
CLOSE complex_cursor; 
DEALLOCATE complex_cursor; 
GO 

來源MSDN(含調整)。

這應該解決您的直接問題。請記住:

  1. 你真的應該修復觸發因爲它可能會導致其他問題。
  2. 小心遊標。我一般他們是一場表演噩夢。我喜歡你的一次性更新,但它們是可以接受的。
+0

這種情況似乎更有可能,因爲它可以更好地解釋第一條語句中的子查詢錯誤。 – 2013-03-11 14:08:33

+0

我相信你對觸發器是100%正確的,但我想重申一下,就像我有其他人一樣,添加'1:00:00'是**不是**無效語法。這個陳述'SELECT CAST('1/1/2013 3:00 PM'AS DATETIME)+'1:00:00''實際上將返回'16:00'小時。 – 2013-03-11 14:17:18

+0

@MichaelPerrenoud,你是正確的,'+'不會拋出錯誤。但是,它不會產生OP正在尋找的功能。所以雖然也許有點不清楚,但我的發言仍然是正確的。但謝謝澄清。 – 2013-03-11 14:28:40

0

您可以使用DateAdd()

UPDATE Table 
SET LocalDateTime = DateAdd(hour,1,LocalDateTime) 
WHERE DateWritten > '3/10/13' 
AND DateWritten < '3/11/13 7:00:00' 
AND varCharColumn <> 'aString' 

另外,您也可以使用BETWEEN的比較對您DateWritten列

UPDATE Table 
SET LocalDateTime = DateAdd(hour,1,LocalDateTime) 
WHERE DateWritten BETWEEN '3/10/13'AND '3/11/13 7:00:00' 
AND varCharColumn <> 'aString' 

基於斷this article,它看起來像你的Table可能在可能阻止更新多個記錄的視圖中使用。

DateAdd documentation

+0

如果他們在第一個語句中得到子查詢錯誤,這並不會改變OP的結果 - 您在這裏所做的只是修復了OP需要使用'DateAdd'的事實。 – 2013-03-11 14:07:59

+0

@MichaelPerrenoud不改變使用+ 1小時不是語法的最佳選擇的事實。如果他嘗試這種方式並且不起作用,那麼我們可以查看其他問題。 – 2013-03-11 14:10:28

+0

我同意OP需要使用'DateAdd',但'+'1:00:00''是*** not ***無效的語法。這個陳述'SELECT CAST('1/1/2013 3:00 PM'AS DATETIME)+'1:00:00''將返回'16:00'小時。 – 2013-03-11 14:13:01