Stored procedures 从存储过程有条件地插入

Stored procedures 从存储过程有条件地插入,stored-procedures,sql-server-2008-r2,Stored Procedures,Sql Server 2008 R2,我正在努力自学SQL。我有一个web matrix项目,我正在进行编辑和显示由SQL server Datatabase支持的帖子。一位同事建议我使用存储过程来提交帖子,而不是内联编写sql 到目前为止,这个过程看起来还可以,但是我想检查一下url段塞是否已经存在,如果已经存在,那么返回这样的消息(url段塞应该是唯一的)。我正在努力在插入前检查。我还读到,从存储过程返回是一种不好的做法,但我认为最好返回一些东西,让调用者知道插入没有进行 任何帮助都将不胜感激 -- =============

我正在努力自学SQL。我有一个web matrix项目,我正在进行编辑和显示由SQL server Datatabase支持的帖子。一位同事建议我使用存储过程来提交帖子,而不是内联编写sql

到目前为止,这个过程看起来还可以,但是我想检查一下url段塞是否已经存在,如果已经存在,那么返回这样的消息(url段塞应该是唯一的)。我正在努力在插入前检查。我还读到,从存储过程返回是一种不好的做法,但我认为最好返回一些东西,让调用者知道插入没有进行

任何帮助都将不胜感激

 -- =============================================
 -- Author:     Dean McDonnell
 -- Create date: 05/12/2011
 -- Description:    Commits an article to the database.
 -- =============================================

 CREATE PROCEDURE CommitPost

 @UrlSlug VARCHAR(100),
 @Heading VARCHAR(100),
 @SubHeading VARCHAR(300),
 @Body VARCHAR(MAX)

 AS

 INSERT INTO Posts(UrlSlug, Heading, SubHeading, Body, Timestamp)

 VALUES(@UrlSlug, @Heading, @SubHeading, @Body, GETDATE())

这就是我目前所拥有的。

要检查是否存在,请执行
选择COUNT
如下操作:

 CREATE PROCEDURE CommitPost

 @UrlSlug VARCHAR(100),
 @Heading VARCHAR(100),
 @SubHeading VARCHAR(300),
 @Body VARCHAR(MAX)

 AS
IF NOT EXISTS (SELECT * FROM Posts WHERE UrlSlug = @UrlSlug)

 INSERT INTO Posts(UrlSlug, Heading, SubHeading, Body, Timestamp)
 VALUES(@UrlSlug, @Heading, @SubHeading, @Body, GETDATE())
SELECT @@ROWCOUNT
CREATE PROCEDURE CommitPost

 @UrlSlug VARCHAR(100),
 @Heading VARCHAR(100),
 @SubHeading VARCHAR(300),
 @Body VARCHAR(MAX)

 AS

 DECLARE @count INT

 SELECT @count = COUNT(*) FROM  Posts WHERE UrlSlug = @UrlSlug

 IF @count = 0 THEN
 BEGIN

   INSERT INTO Posts(UrlSlug, Heading, SubHeading, Body, Timestamp)
   VALUES(@UrlSlug, @Heading, @SubHeading, @Body, GETDATE())
 END
您可以在UrlSlug上设置一个唯一的索引,使数据库拒绝插入数据库中已有的URL,但是您应该在插入之前进行检查


如果调用者想知道是否插入了行,请返回
@count
值。如果为0,则插入该行,否则不插入。我不知道从SP返回值有什么“不好的做法”。但是,由于SP没有结果,您需要使用out参数。

如果您只执行一条类似于此插入的SQL语句,您可以只使用paratemerized查询,即我假设您使用的是.NET

如果您想返回值,我建议您使用函数而不是存储过程。您可以从函数返回表或任何您想要的内容

不过也有一些限制。您可以更深入地了解这些差异,以了解何时使用它们。这里有一个链接可以帮助您开始:

若仍要使用存储过程,可以使用SELECT返回单行、单列结果集,也可以只使用输出参数

如果您想根据列是否存在来执行操作,我建议您查看语句。这样您将只对数据库执行一个查询,而不是两个或多个查询(执行SELECT,然后执行INSERT)


还有其他使用数据库访问的方法,如代码中数据库顶部的各种ORM,它们将使您的生活更轻松,如LINQ到SQL等。还有很多可能性。您需要确定在给定情况下什么是最好的。

调用RAISERROR而不是让他们检查行数如何?