关于一些更新存储过程

时间:2010-12-28 20:07:03

标签: c# asp.net sql-server sql-server-2005

我有两张表如下: -

表1:

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

表2:

        -------------------------
        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中有一行,如上所示,PageID = 1。

现在,当我更新此行时,就像我没有从下拉列表中更改标题,只更改了文本框中的内容,它没有更新记录..当存储过程的更新查询未执行时,显示标签上写着“已存在此标题的页面”。

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

修改

@gbn:如果更新,IF条件会起作用吗?我的意思是让我说我​​正在用TitleID = 1更新页面,我更改了它的内容,然后当我更新时,它将执行那个IF条件并且它仍然不会更新coz TitleID = 1已经退出!它只会更新如果TitleID表1中没有= 1。不是吗?猜猜我很困惑。请回答。感谢。

4 个答案:

答案 0 :(得分:2)

TitleID的{​​{1}}上应用UNIQUE键约束可确保Table 1的重复值不会保存到表中。

就你的SP代码而言,gbn的reply强调要纠正条件检查以使其有效..

HTH!

答案 1 :(得分: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

为了保护您的数据,您应该在Table1中的TitleID上拥有唯一索引。

答案 2 :(得分: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     
}

答案 3 :(得分:0)

我不确定我完全理解,但我会为你拍摄一下。我假设您无法更改数据结构。

首先,我会在Title的{​​{1}}列上添加一个唯一约束。然后我会对Table2中的TitleId (FK)设置一个唯一约束。这将确保您在Table1中没有两个具有相同标题的条目。

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

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