关于某些更新存储过程

问题描述 投票:0回答:4

我有两个表,如下:-

Table1:

        -------------------------------------
        PageID|Content|TitleID(FK)|LanguageID
        -------------------------------------
        1     |abc     |101       |1
        2     |xyz     |102       |1
        --------------------------------------

Table2:

        -------------------------
        TitleID|Title |LanguageID
        -------------------------
        101    |Title1|1
        102    |Title2|1
        ------------------------

我不想在我的Table1(内容表)中添加重复项。就像..不能有两个标题相同的页面。我需要在“插入/更新存储过程”中添加哪些检查?如何确保从不添加重复项。

我尝试如下:-

CREATE PROC InsertUpdatePageContent      
(
 @PageID int,      
 @Content nvarchar(2000),
 @TitleID int  
)      
AS      
BEGIN      
  IF(@PageID=-1)
  BEGIN
    IF(NOT EXISTS(SELECT TitleID FROM Table1 WHERE LANGUAGEID = @LANGUAGEID))
    BEGIN
      INSERT INTO Table1(Content,TitleID)
      VALUES(@Content,@TitleID)
    END
  END
  ELSE
  BEGIN
    IF(NOT EXISTS(SELECT TitleID FROM Table1 WHERE LANGUAGEID = @LANGUAGEID))
    BEGIN
      UPDATE Table1 
      SET Content = @Content, TitleID = @TitleID 
      WHERE PAGEID = @PAGEID
    END
  END 
END 

现在正在发生的事情是它正在插入新记录,并且不允许添加重复项,但是当我更新它给我带来问题时。

在aspx页面上,我有一个下拉列表控件,该控件绑定到返回表2(标题表)的DataSource上,还有一个文本框,用户在其中输入要存储的Page内容。

当我更新时,就像上面说的那样,我在表1中有一行,页面ID为1。

现在,当我更新此行时,就像我没有从下拉菜单中更改标题,而是仅更改文本框中的内容一样,它不更新记录..并且当存储过程的更新查询不执行时,它显示一个标有“具有该标题的页面已存在”的标签。

因此,每当我更新现有记录时,该标签就会显示在屏幕上。如何在我的Update存储过程中更改该IF条件?

编辑:

@@ gbn:如果发生更新,该IF条件会起作用吗?我的意思是说我要用TitleID = 1更新页面,更改内容,然后在更新时执行IF条件,但仍然不会更新,因为TitleID = 1已经退出!只有在TitleID的情况下才会更新表1中没有= 1。是不是猜猜我很困惑。请回答。谢谢。

c# asp.net sql-server sql-server-2005
4个回答
1
投票

对于更新,您可以设置此条件以避免多个页面使用相同的标题。

IF NOT EXISTS (SELECT 1 from Table1 where TitleId = @TitleID and PageID <> @PageID) -- This makes sure that there is no 'other page' with same title (updated from UI)
{
    UPDATE Table1          
    SET Content = @Content, TitleID = @TitleID          
    WHERE PAGEID = @PAGEID     
}

2
投票

TitleID中的Table 1上应用UNIQUE键约束将确保没有将TitleID的重复值保存到表中。

就您的存储过程的代码而言,gbn的reply突出显示了要纠正的条件检查以使其起作用。


1
投票

这将始终返回false

IF(NOT EXISTS(SELECT TitleID FROM Table1 WHERE LANGUAGEID=LANGUAGEID))

您正在将一列与其自身进行比较,它匹配= EXISTS

应该是类似的东西

CREATE PROC InsertUpdatePageContent (
 @PageID int,      
 @Content nvarchar(2000),
 @TitleID int
)      
AS      
IF(@PageID=-1)
BEGIN
    IF NOT EXISTS (SELECT TitleID FROM Table1 WHERE TitleID=@TitleID)
       INSERT INTO Table1(Content,TitleID) VALUES(@Content,@TitleID)
END
ELSE
    UPDATE Table1 SET Content= @Content, TitleID=@TitleID WHERE PAGEID=@PAGEID
GO

为了保护您的数据,表1中的TitleID应该具有唯一索引。


0
投票

我不确定我是否完全理解,但是我会为您拍照。我假设您无法更改数据结构。

首先,我将对Title中的Table2列施加唯一约束。然后,我将对TitleId (FK)中的Table1施加唯一约束。这样可以确保Table1中没有两个标题相同的条目。

然后,在存储过程中,我将对传入的参数和数据库中存在的参数进行比较,以便根据传入的内容验证更新或插入。

我通常使用存储过程作为某些软件在关系数据模型和对象模型之间的API。我很少将数据库标识列公开给应用程序的存储过程签名。数据库标识列的处理方式不同于软件可能用来标识实体的唯一标识符。如果没有有关应用程序其余部分以及需要为您的解决方案一起工作的其他存储过程的其他信息,很难提供更多帮助。

© www.soinside.com 2019 - 2024. All rights reserved.