2016-07-28 37 views
0

Iam嘗試這個查詢,我得到以下錯誤。我還收到一個錯誤,說主鍵約束PK_ITEMPATH已被違反。我應該怎麼做序來糾正這個錯誤的查詢將無法成功運行當子查詢遵循=,!=,<, <= , >,> =或當子查詢用作表達式時,這是不允許的。超過1個值被返回。

USE Sk_EN_UserDB 
GO 

SET NOEXEC OFF 
GO 
IF(DB_NAME() NOT LIKE '%_UserDB') 
BEGIN 
    RAISERROR ('You must run this script in UserDB database',18,0) 
    SET NOEXEC ON 
END 

GO 

IF(NOT EXISTS(SELECT * FROM UserRights.Path WHERE PathID = 'Myviews')) 
BEGIN 
    insert into UserRights.Path(PathID, IsVendorSpecific) 
    values('Myviews', 0) 
END 


IF(NOT EXISTS(SELECT * FROM UserRights.Products WHERE ProjectName = 'Products')) 
BEGIN 
    insert into UserRights.Products(ProductID, ProjectName) 
    values(
     (select MAX(ProductID) + 1 from [UserRights].Products), 
     'Products' 
    ) 
END 

insert into UserRights.ProductsToPath(ProductID, PathID) 
values(
    (select ProductID 
    from [UserRights].Products 
    where ProjectName = 'Products'), 
    'Myviews' 
) 

insert into UserRights.ModulesToProducts(ModuleID, ProductID) 
values(
    (select ModuleID 
    from [UserRights].[Modules] 
    where DisplayName = 'Products Product' or HierarchyName like '%Products Product%'), 
    (select ProductID 
    from [UserRights].Products 
    where ProjectName = 'Products') 
) 
+1

'我該怎麼做' - 確保你在'values'中使用的子查詢每個返回一個值。 – GSerg

+0

您的一個SELECT查詢返回多條記錄。考慮使用LIMIT/TOP 1. –

+0

每個問題有一個問題。另外,你使用的是MySQL還是MS SQL Server?不要標記不涉及的產品。 – jarlh

回答

0

首先,你內心的選擇很可能返回每INSERT語句超過1倍的值。

嘗試從改變你的INSERT語句:

insert into UserRights.ProductsToPath(ProductID, PathID) 
values(
    (select ProductID 
    from [UserRights].Products 
    where ProjectName = 'Products'), 
    'Myviews' 
) 

到:

insert into UserRights.ProductsToPath(ProductID, PathID) 
(select TOP 1 ProductID 
    from [UserRights].Products 
    where ProjectName = 'Products'), 
    'Myviews' 

如果你需要做批量插入(每聲明超過1個記錄),use a cursor

關於ITEMPATH PK Violation - 你的問題沒有給我足夠的關於你的表模式的信息,但是這個錯誤意味着你可能插入了一個已經存在的主鍵的記錄。最有可能與你的內在選擇一樣。

+0

@drminnar,erros不會再來,但是我得到'錯誤的語法附近','。'錯誤,當我改變它。 –

相關問題