0

我的修改页面上有一个文本框,其中包含数据库中的现有数据。此数据在 SQL Server 表中是单独的行,但在文本框中显示为用逗号分隔的单行。

例如:表

keyid   name 
--------------
  101     ss
  105     hh
  109     tt

在我的网络表单中,它显示在像 ss,hh,tt. 有一个桥接表 ( Keysproducts),其中包含keyidand productid(与 相关的产品keyid

我的问题是:

在我的文本框中添加更多条目以及现有条目时,我收到此错误消息,指出未插入重复值并显示我现有的 id。下面是我的存储过程。

我正在检查是否keyname存在,如果不存在我插入行,否则我更新它。如果我的方法是错误的,请指导我。

create PROCEDURE [dbo].[modify] 
      (
        @keyName nvarchar(256),
        @productdbid uniqueidentifier

      )
AS
Begin
  declare 
    @productid uniqueidentifier,
    @keyid uniqueidentifier,
    @id uniqueidentifier;

    declare @keydata table (keyid uniqueidentifier);

    set @productid =(select ProductID from Products where ProductID = @productdbid );

Begin


    if not exists(select keyname from keys where KeyName = @keyName)
    begin
       insert into Keys(KeyId, KeyName)
       output inserted.KeyId into @keydata(keyid)
       values (newid(), @keyName);

       select @keyid = keyid from @keydata;

       insert into KeysProducts(KeyId,productId)
        values (@keyid, @productid);
     end
     else
     begin
        set @id = (select keyid  from keys where KeyName = @keyName)

        update keywords 
        set KeyId = @id, KeyName = @keyName 
        where KeyName= @keyName;
    end

    if not exists(select * from Keysproducts where ProductID = @productid and KeyId= @id) 
     begin
        insert into Keysproducts(KeyId, ProductID)
        values (@id, @productid);       
     end
     else
     begin
         update Keysproducts 
         set KeyId = @id, productID = @productid;
     end
  end
end

结尾

4

1 回答 1

0

好吧,我想我们需要更多关于你如何使用这个存储过程的信息。如果您的文本框最初包含 ss,hh,tt ,并且我将其更改为 ss,hh,tt,zz 例如,我假设您仍然为每个值运行一次该过程?所以你会为 ss 运行它,然后分别为 hh、tt 和 zz 运行它?

您从哪里获得 productdbid 参数值?

您对表有哪些约束,违反了哪一个(PK 或某些唯一约束)?

你得到什么确切的错误?

我还想指出,您上次更新时没有 WHERE 子句,因此您正在尝试更新表中的每条记录。如果此 Keysproduct 表是您收到错误的表,这就是原因。

 begin          
    update Keysproducts   
    set KeyId = @id, productID = @productid;
 end 
于 2012-07-11T19:05:56.440 回答