Условная вставка из хранимой процедуры - PullRequest
3 голосов
/ 06 декабря 2011

Я пытаюсь научить себя SQL.У меня есть проект веб-матрицы, над которым я работаю, чтобы редактировать и отображать сообщения, поддерживаемые базой данных SQL-сервера.Коллега по работе предложил мне использовать хранимую процедуру для фиксации поста, а не писать встроенный 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())

Это то, что я имею до сих пор.

Ответы [ 3 ]

2 голосов
/ 06 декабря 2011
 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
1 голос
/ 06 декабря 2011

Чтобы проверить наличие, сделайте SELECT COUNT примерно так:

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.

0 голосов
/ 06 декабря 2011

Если вы сделаете только один SQL-оператор, такой как эта вставка, вы можете просто использовать паратеризованный запрос, т.е. я предполагаю, что вы используете .NET.

Если вы хотите вернуть значения, я бы предложил вместо этого использовать FUNCTIONхранимой процедуры.Вы можете возвращать либо таблицы, либо любые другие функции из функции.

Однако существуют некоторые ограничения.Вы можете углубиться в различия, чтобы увидеть, что и когда используется.Вот ссылка, которая может помочь вам начать работу:

Функция против хранимой процедуры в SQL Server

Если вы все равно хотите использовать хранимую процедуру, вы можете либо вернутьнабор результатов из одной строки, одного столбца, используя SELECT, или просто используйте выходной параметр.

Если вы хотите выполнять действия в зависимости от того, существует столбец или нет, я бы посоветовал вам посмотреть MERGE оператор. Таким образом, вы выполняете только один запрос к базе данных вместо двух или более (выполнение SELECT, а затем INSERT).

Существуют также другие способы использования доступа к базе данных, такие как различные ORM поверхбаза данных в коде, которая сделает вашу жизнь проще, например, LINQ-to-SQL и т. д. Существует множество возможностей.Вам нужно определить, что лучше в данной ситуации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...