2014-07-22 85 views
0

嘗試檢查插入的表列level_name中輸入的值是否與Levels表列level_name匹配。我的查詢返回錯誤Subquery returned more than 1 value.。試圖寫下Dan Guzman的代碼。插入觸發器問題,子查詢返回多於1行

Declare @levelname nvarchar(MAX)= 
( 
SELECT [LEVEL_NAME] + ' ' 
FROM inserted 
WHERE (select LEVEL_NAME from levels where level_name=(select level_name 
from inserted)) IS NULL 
FOR XML PATH('') 
); 
if @levelname is not null 
BEGIN 
    RAISERROR(); 
END 
+1

爲什麼你想要使用觸發器來強制實施參照完整性?不知道這個觸發器是用於哪個表,但這是一個外鍵或一個唯一的約束。不要通過這樣的代碼來做到這一點,從長遠來看這會引起你無法形容的痛苦。 –

+0

我認爲這是因爲我的要求是在日誌中記錄不匹配的值 – user3844877

回答

0

我建議使用前1在您的查詢,或者使用以下格式:

IF Exists(SELECT [LEVEL_NAME] 
      FROM inserted i 
      INNER JOIN levels l ON l.Level_name = i.Level_name) Begin 
    RAISERROR('Your error message',16,1); 
END 

OR

IF (SELECT COUNT(*) 
    FROM inserted i 
    INNER JOIN levels l ON l.Level_name = i.Level_name)=0 Begin 
    RAISERROR('Your error message',16,1); 
END 

我建議在level_name列中使用唯一索引。爲了限制你的用戶插入重複的level_name值。

+0

感謝您的代碼,但得到一個錯誤'在預期條件的上下文中指定的非布爾類型的表達式')' – user3844877

+0

您必須在RAISERROR命令中設置錯誤消息。 –

+0

已在where子句中添加了'= 0',並獲得了「超過1行」的相同錯誤。更新後的代碼 'IF EXISTS(SELECT [GEOLEVEL_NAME] FROM插入 WHERE(從RIF40_COVARIATES 選擇GEOLEVEL_NAME 其中geolevel_name =(從插入選擇geolevel_name ))= 0 ) 開始 RAISERROR( 'geolevel名稱不退出' ,16,1); END END' – user3844877

0

試試這個:

DECLARE @levelname NVARCHAR(MAX)= 
( 
SELECT [LEVEL_NAME] + ' ' 
FROM inserted 
WHERE EXISTS (SELECT LEVEL_NAME FROM levels 
        WHERE level_name IN (SELECT level_name FROM inserted)) 
FOR XML PATH('') 
); 
IF @levelname IS NOT NULL 
BEGIN 
    RAISERROR(); 
END 
+0

'插入到測試(level_name)值('level_medium'),('level_high')'如果Levels表中缺少兩個級別,代碼將工作。如果缺少一個並且存在錯誤,則不會引發錯誤。 – user3844877

+0

@ user3844877我已更新...現在檢查 – Jesuraja

+0

現在,如果兩個代碼都沒有丟失,代碼就可以正常工作,但如果丟失一個,並且不存在則代碼不可用。 – user3844877