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