2017-08-08 59 views
1

這主要是一個好奇的問題。我剛剛經歷了一個情況,即測試數據庫上,我有以下查詢:Microsoft SQL Server - 限制子查詢

update table 
set column1 = 1 
where column2 in (1,2) 

但這跟上錯誤執行該子查詢返回多個值。

現在我檢查以確保我沒有多個身份密鑰或'in'值是唯一的。所有的意圖和目的都不應該發生。

檢查數據庫的LIVE副本,同樣的查詢沒有問題。因此,最後,我的問題是:

您可以對Microsoft SQL Server設置或數據庫結構進行哪些操作來創建此類方案?

+12

你的表是否有更新觸發器?我猜測它的確如此,並且它假定「插入」或「刪除」只有一行。 –

+0

所以......你應該碰到PK違規的唯一方法是如果Column1是複合PK或PK本身的一部分。查詢看起來很簡單:如果在同一元組的column2中發現值(1)或(2),請更新column1並將其設置爲(1)。我猜測你的測試數據庫有你的產品不同的起始記錄。你可以將生產值複製到測試數據庫並再次運行? – Milan

+0

@Milan你是如何從「子查詢返回多個值」到「PK違規」的? – HABO

回答

2

對於創建這種場景的Microsoft SQL Server設置或數據庫結構,您可以做些什麼?

正如評論中提到的,你可能寫的觸發器寫得很差。示例場景:

CREATE TABLE aud(column2 INT, comment NVARCHAR(150)); 
CREATE TABLE tab(column1 INT, column2 INT); 

INSERT INTO aud(column2) VALUES (1),(2),(3); 
INSERT INTO tab(column1, column2) VALUES (0,1),(-1, 2), (-2,3); 
GO 

CREATE TRIGGER trg_tab_i ON tab 
FOR UPDATE 
AS 
BEGIN 
    UPDATE aud 
    SET comment = 'Changed value ...' 
    WHERE column2 = (SELECT column2 FROM inserted); 
END 
GO 


UPDATE tab 
SET column1 = 1 
WHERE column2 in (1,2); 

消息512,級別16,狀態1,過程trg_tab_i,5號線[批量起始行19]

子查詢返回多個值。當子查詢遵循=,!=,<,< =,>,> =或當子查詢用作表達式時,這是不允許的。

UPDATE tab 
SET column1 = 1 
WHERE column2 in (1); 
-- (1 row(s) affected) 
-- (1 row(s) affected) 

DBFiddle Demo

當只有一行受到影響,一切正常。

+1

謝謝。事實證明,我們的軟件供應商正在測試自定義功能的觸發器,但我並沒有意識到它已將其傳遞給我們的_test DB。 (我的同事知道這一點,但他從來沒有想過這是一個錯誤的觸發器) – EkeshOkor