2013-03-07 241 views
0

我的查詢來更新整個表看起來是這樣的:錯誤:子查詢返回多個值

update works set nIndex = cast(replace(replace((select strIndex 
from works), char(10), ''), char(10), '') as int) 

然而,當我運行它,我得到這個錯誤:

"Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression."

回答

1

由於錯誤說,你是返回一個以上的記錄在這裏:

select strIndex from works 

所以要嘗試更新的作品表中的每個strIndex值的單個值。這不起作用。

如何讓這個工作真的取決於你正在嘗試做什麼。既然你沒有進入這裏,我不會推測什麼可以解決錯誤。

2

你不需要子選擇。試試這個:

update works 
    set nIndex = cast(replace(replace(strIndex, char(10), ''), char(10), '') as int) 

你再選擇返航所有值的strIndex更新每一行。這是過度殺傷。只需對一行內的值執行castreplace

0

你也可以在你的子查詢中添加TOP1,這將解決這個錯誤

update works set nIndex = cast(replace(replace((select TOP 1 strIndex 
from works), char(10), ''), char(10), '') as int) 

但還沒有garrantee的結果是你期待什麼,因爲我們沒有上下文。

0

你有基本的錯誤說,你正在試圖獲得一些結果參數nIndex,因爲這是結果: 從作品

忘記所有的鑄件選擇strIndex並取代你說: 參數nIndex = (1,2,3,4,...)這是不可能的,因爲你只能在那裏給出一個值。

對於這個工作,你需要有一些限制的結果:從 作品WHERE PRIMARY_KEY = SOMETHING 這不會解決你的問題的有效途徑選擇strIndex,但它是你理解。

由於兩列是在同一個表,這是沒有必要的,你可以簡單地做:

更新作品設置參數nIndex = CAST(更換(更換(strIndex,CHAR(10),「」 ),char(10),'')as int)

0

除了其他答覆,我懷疑你不是故意要兩次取代char(10)。你可能需要的是更換兩char(10)char(13)

UPDATE dbo.works 
    SET nIndex = CONVERT(INT, REPLACE(REPLACE(
    strIndex, CHAR(13), ''), CHAR(10), '')); 

當然,因爲strIndex是一個字符串,它可能包含其他字符,除了CR/LF,所以你可能要添加一個WHERE條款:

WHERE ISNUMERIC(REPLACE(REPLACE(strIndex, CHAR(13), ''), CHAR(10), '')) = 1; 

或者你可以使用一個CASE表達的更新,以確保不相容的值設置爲NULL,如:

UPDATE dbo.works 
    SET nIndex = CASE 
    WHEN ISNUMERIC(REPLACE(REPLACE(strIndex, CHAR(13), ''), CHAR(10), '')) = 1 
    THEN 
    CONVERT(INT, REPLACE(REPLACE(
    strIndex, CHAR(13), ''), CHAR(10), '')) 
    ELSE NULL END; 

在SQL Server 2012中,這個邏輯非常簡單, TRY_CONVERT()