Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Объединение хранимых процедур для вставки и обновления  [new]
Денчик
Member

Откуда:
Сообщений: 9
Ребятки добрый день,
Возник вопрос, у меня есть две рабочие процедуры для вставки и обновления и они работают по отдельности, а вот хотелось бы их объединить да не получается, подскажите как связать ?


CREATE PROCEDURE Tools
(@CategoryID_1 int,
@CategoryName_2 nvarchar(100),
@Description_3 ntext)

AS INSERT INTO Categories
(CategoryID,
CategoryName,
Description)

VALUES
(@CategoryID_1,
@CategoryName_2,
@Description_3)

GO


CREATE PROCEDURE Tools1

(@CategoryID_1 [int],
@CategoryID_2 [int],
@CategoryName_3 [nvarchar](50),
@Description_4 [ntext],


AS UPDATE [Teachdb].[dbo].[Categories]

SET [CategoryID] = @CategoryID_2,
[CategoryName] = @CategoryName_3,
[Description] = @Description_4,


WHERE
( [CategoryID] = @CategoryID_1)
GO
1 апр 13, 12:58    [14121144]     Ответить | Цитировать Сообщить модератору
 Re: Объединение хранимых процедур для вставки и обновления  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
Напишите одну, используя инструкцию MERGE. Подробности и примеры в документации.
1 апр 13, 13:09    [14121205]     Ответить | Цитировать Сообщить модератору
 Re: Объединение хранимых процедур для вставки и обновления  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
а какой смысл в их объединении? две разные задачи - генерация ключа и обновление информации на основе заданного ключа - как их можно объединить??
1 апр 13, 13:33    [14121329]     Ответить | Цитировать Сообщить модератору
 Re: Объединение хранимых процедур для вставки и обновления  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Какой-то странный этот ключ, если его апдейтить можно. Обычно апдейтят всё что угодно, кроме первичного ключа.
1 апр 13, 13:37    [14121344]     Ответить | Цитировать Сообщить модератору
 Re: Объединение хранимых процедур для вставки и обновления  [new]
Денчик
Member

Откуда:
Сообщений: 9
Ребятки всем спасибо решил проблемку:

CREATE PROCEDURE Tools
(
@Mode nvarchar(100),
@CategoryID int,
@CategoryName nvarchar(100),
@Description ntext
)

AS
BEGIN
IF @Mode = 'INSERT'
BEGIN
INSERT INTO Categories (CategoryID, CategoryName, Description)
VALUES (@CategoryID, @CategoryName, @Description)
END
ELSE IF @Mode = 'UPDATE'
BEGIN
UPDATE Categories
SET CategoryID = @CategoryID,
CategoryName = @CategoryName,
Description = @Description
WHERE ([CategoryID] = @CategoryID)
END
END
go
1 апр 13, 14:10    [14121530]     Ответить | Цитировать Сообщить модератору
 Re: Объединение хранимых процедур для вставки и обновления  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Денчик
Ребятки всем спасибо решил проблемку:

CREATE PROCEDURE Tools
(
@Mode nvarchar(100),
@CategoryID int,
@CategoryName nvarchar(100),
@Description ntext
)

AS
BEGIN
IF @Mode = 'INSERT'
BEGIN
INSERT INTO Categories (CategoryID, CategoryName, Description)
VALUES (@CategoryID, @CategoryName, @Description)
END
ELSE IF @Mode = 'UPDATE'
BEGIN
UPDATE Categories
SET CategoryID = @CategoryID,
CategoryName = @CategoryName,
Description = @Description
WHERE ([CategoryID] = @CategoryID)
END
END
go
Ха-ха!
Это нормально - апдейтить строку по новому значению ключа, которого в таблице ещё нет?!
1 апр 13, 14:21    [14121588]     Ответить | Цитировать Сообщить модератору
 Re: Объединение хранимых процедур для вставки и обновления  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Денчик,

прислушайтесь к словам Гость333 и никогда не меняйте значение первичного суррогатного ключа!
Бессмысленно. Естественного PK - это ещё понятно.

Я, правда, ярый сторонник суррогатных PK!
1 апр 13, 14:25    [14121603]     Ответить | Цитировать Сообщить модератору
 Re: Объединение хранимых процедур для вставки и обновления  [new]
sphinx_mv
Member [заблокирован]

Откуда:
Сообщений: 1672
iap
Денчик
Ребятки всем спасибо решил проблемку:
пропущено...
Ха-ха!
Это нормально - апдейтить строку по новому значению ключа, которого в таблице ещё нет?!
Серверу это пофиг - он просто ничего в этом случае не выполнит...
А "со времен царя Гороха" так делалось: сначала апдейт записи, потом если @@rowcount на 0 - вставка новой записи...
1 апр 13, 14:38    [14121663]     Ответить | Цитировать Сообщить модератору
 Re: Объединение хранимых процедур для вставки и обновления  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
sphinx_mv
iap
пропущено...
Ха-ха!
Это нормально - апдейтить строку по новому значению ключа, которого в таблице ещё нет?!
Серверу это пофиг - он просто ничего в этом случае не выполнит...
А "со времен царя Гороха" так делалось: сначала апдейт записи, потом если @@rowcount на 0 - вставка новой записи...
Какой же тогда смысл в SET CategoryID = @CategoryID
Только на Гороха ссылаться не надо.
1 апр 13, 14:47    [14121727]     Ответить | Цитировать Сообщить модератору
 Re: Объединение хранимых процедур для вставки и обновления  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Да и проверок на количество обработанных записей с последующей вставкой тут тоже нет
1 апр 13, 14:48    [14121739]     Ответить | Цитировать Сообщить модератору
 Re: Объединение хранимых процедур для вставки и обновления  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
iap
SET CategoryID = @CategoryID

Они просто ничего не знают о существовании связей в БД ;)
1 апр 13, 14:49    [14121742]     Ответить | Цитировать Сообщить модератору
 Re: Объединение хранимых процедур для вставки и обновления  [new]
sphinx_mv
Member [заблокирован]

Откуда:
Сообщений: 1672
iap
sphinx_mv
пропущено...
Серверу это пофиг - он просто ничего в этом случае не выполнит...
А "со времен царя Гороха" так делалось: сначала апдейт записи, потом если @@rowcount на 0 - вставка новой записи...
Какой же тогда смысл в SET CategoryID = @CategoryID
Только на Гороха ссылаться не надо.
А придется...
Потому как я отвечал на 14121588, где было написано:
Это нормально - апдейтить строку по новому значению ключа, которого в таблице ещё нет?!
Отвечу еще раз: это, в строгом в соотвествии с обычным и вполне неплохо задокументированным поведением сервера - вполне нормально... Боле того: команды обновления данных, условиям которых (по ключам или без оных) может не удовлетворять ни одна запись в таблице - самое обычное явление...

Ну, а по поводу "SET трам-пам-пам"...
Вы хотите обсудить со мной реализацию "MERGE" от "совсем начинающего" топикстарера?
Вы уверены, что мне это должно быть интересно?!
1 апр 13, 15:32    [14122012]     Ответить | Цитировать Сообщить модератору
 Re: Объединение хранимых процедур для вставки и обновления  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
sphinx_mv
Вы уверены, что мне это должно быть интересно?!
Да мне это всё равно.
Ничего обсуждать не собирался.
В том числе говнокод ТС с апдейтом суррогатного ключа.
1 апр 13, 15:39    [14122074]     Ответить | Цитировать Сообщить модератору
 Re: Объединение хранимых процедур для вставки и обновления  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
автор
Боле того: команды обновления данных, условиям которых (по ключам или без оных) может не удовлетворять ни одна запись в таблице - самое обычное явление...

ой ли... прям самое обычное. Не хоцца разводить холивар..но сие совершенно не правильное поведение любой системы
Попытка апдейта уже удаленной записи - должна хотя бы оповестить клиента о случившемся,а не тупо вставить "чего-то там" в таблицу,не говоря уже о попытке апдейта записи которой не существует в принцыпе
1 апр 13, 15:41    [14122093]     Ответить | Цитировать Сообщить модератору
 Re: Объединение хранимых процедур для вставки и обновления  [new]
Гузы
Guest
Денчик
Ребятки всем спасибо решил проблемку:

CREATE PROCEDURE Tools
(
@Mode nvarchar(100),
@CategoryID int,
@CategoryName nvarchar(100),
@Description ntext
)

AS
BEGIN
IF @Mode = 'INSERT'
BEGIN
INSERT INTO Categories (CategoryID, CategoryName, Description)
VALUES (@CategoryID, @CategoryName, @Description)
END
ELSE IF @Mode = 'UPDATE'
BEGIN
UPDATE Categories
SET CategoryID = @CategoryID,
CategoryName = @CategoryName,
Description = @Description
WHERE ([CategoryID] = @CategoryID)
END
END


Так не затрагивает суррогатный ключ:
CREATE PROCEDURE Tools
(
    @CategoryID int,
    @CategoryName nvarchar(100),
    @Description ntext
)

AS 
BEGIN 
declare @id int;
    IF exists (select CategoryID from Categories where CategoryID = @CategoryID)
   begin
        UPDATE Categories
            SET  
                CategoryName  = @CategoryName,
                Description   = @Description
        WHERE ([CategoryID]   = @CategoryID)
  set @id = @CategoryID
  end
    ELSE 
if @CategoryID is null
  begin  
        INSERT INTO Categories (CategoryID, CategoryName, Description) 
        VALUES (@CategoryID, @CategoryName, @Description)
   set id = SCOPE_IDENTITY;
  end
return @id;
END

То бишь, если на входе @CategoryID is Null - вставка, а если есть запись с таким - изменение.
1 апр 13, 16:03    [14122281]     Ответить | Цитировать Сообщить модератору
 Re: Объединение хранимых процедур для вставки и обновления  [new]
sphinx_mv
Member [заблокирован]

Откуда:
Сообщений: 1672
Maxx
автор
Боле того: команды обновления данных, условиям которых (по ключам или без оных) может не удовлетворять ни одна запись в таблице - самое обычное явление...

ой ли... прям самое обычное. Не хоцца разводить холивар..но сие совершенно не правильное поведение любой системы
Что с "оптимистическими блокировками" делать будем?
Maxx
Попытка апдейта уже удаленной записи - должна хотя бы оповестить клиента о случившемся,а не тупо вставить "чего-то там" в таблицу,не говоря уже о попытке апдейта записи которой не существует в принцыпе
Товарищ прапорщик, Вы в курсе что мы не в армии?
А то теперь и просто предположить, чтобы пользователи "чего-то там" очень "тупо вставляли" в базу - это жеж смерть для базы!!! А то кто же их проконтролирует-то?! И сообщения они по определению не читают... Повеселило, в-общем...

Хотя с "сообщением о случившемся" - согласен...
1 апр 13, 16:35    [14122525]     Ответить | Цитировать Сообщить модератору
 Re: Объединение хранимых процедур для вставки и обновления  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
sphinx_mv
Товарищ прапорщик, Вы в курсе что мы не в армии?

тамбовски волк ... В курсе вкурсе..но сие никак к теме не относится
1 апр 13, 16:38    [14122547]     Ответить | Цитировать Сообщить модератору
 Re: Объединение хранимых процедур для вставки и обновления  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31444
sphinx_mv
Отвечу еще раз: это, в строгом в соотвествии с обычным и вполне неплохо задокументированным поведением сервера - вполне нормально... Боле того: команды обновления данных, условиям которых (по ключам или без оных) может не удовлетворять ни одна запись в таблице - самое обычное явление...
Зачем писать код, который гарантированно никогда не выполнится???
UPDATE Categories
SET CategoryID = @CategoryID
WHERE ([CategoryID] = @CategoryID)
Я не знаю, почему у вас так всегда было принято, я не видел, что бы так писали, да ещё и считали это хорошей практикой.
1 апр 13, 18:12    [14123166]     Ответить | Цитировать Сообщить модератору
 Re: Объединение хранимых процедур для вставки и обновления  [new]
sphinx_mv
Member [заблокирован]

Откуда:
Сообщений: 1672
alexeyvg
sphinx_mv
Отвечу еще раз: это, в строгом в соотвествии с обычным и вполне неплохо задокументированным поведением сервера - вполне нормально... Боле того: команды обновления данных, условиям которых (по ключам или без оных) может не удовлетворять ни одна запись в таблице - самое обычное явление...
Зачем писать код, который гарантированно никогда не выполнится???
UPDATE Categories
SET CategoryID = @CategoryID
WHERE ([CategoryID] = @CategoryID)
Я не знаю, почему у вас так всегда было принято, я не видел, что бы так писали, да ещё и считали это хорошей практикой.
У Вас драйвера хрустального шара какой версии? Срочно обновитесь!
Код, который у Вас "заведомо никогда не выполнится" на самом деле выполняется. При определенных условиях.

И вообще "я не знаю", что, где и когда Вы вообще видели, но распрастраненность такой практики "в общем случае", как бы, зашкаливает...
Поиск в гугле по insert update mssql первой же ссылкой дает чуть ли не все реально возможные (и применяемые) варианты...

Вариант 1:
if exists (select * from table where key = @key)
   update table set ... where key = @key
else
   insert table (key, ...)
   values (@key, ...)

Вариант 2:
update table set ... 
where key = @key

if @@rowcount = 0
   insert table (key, ...) values (@key,..)
.
Вариант 3 с использованием MERGE исключаю ввиду полной очевидности.

Хорошая практика... Плохая практика... Попробуйте предложить вариант лучше!
Особенно с учетом того, что MERGE (как самый хороший вариант) появился в MSSQL не так уж и давно...
1 апр 13, 19:03    [14123414]     Ответить | Цитировать Сообщить модератору
 Re: Объединение хранимых процедур для вставки и обновления  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31444
sphinx_mv
Код, который у Вас "заведомо никогда не выполнится" на самом деле выполняется. При определенных условиях.
Ну вы поняли, что я имел в виду. Код выполняется всегда, для этого нужно только одно условие - чтобы была таблица и поле.

Я имел в виду, что данные в БД после выполнения не изменятся, если конечно нету какого нибуть триггера.


sphinx_mv
Поиск в гугле по insert update mssql первой же ссылкой дает чуть ли не все реально возможные (и применяемые) варианты...
Давайте всё таки рассматривать конкретный критикуемый вариант:
UPDATE Categories
SET CategoryID = @CategoryID
WHERE ([CategoryID] = @CategoryID)

Ваши объяснения не пролили свет на задачу, решаемую этой операцией.
Зачем обновлять ПК на то же самое значение, чем эта практика так хороша?

Критикуют тут именно обновление CategoryID = @CategoryID WHERE CategoryID = @CategoryID, больше ничего.
1 апр 13, 19:52    [14123533]     Ответить | Цитировать Сообщить модератору
 Re: Объединение хранимых процедур для вставки и обновления  [new]
sphinx_mv
Member [заблокирован]

Откуда:
Сообщений: 1672
alexeyvg
sphinx_mv
Код, который у Вас "заведомо никогда не выполнится" на самом деле выполняется. При определенных условиях.
Ну вы поняли, что я имел в виду. Код выполняется всегда, для этого нужно только одно условие - чтобы была таблица и поле.

Я имел в виду, что данные в БД после выполнения не изменятся, если конечно нету какого нибуть триггера.
Я сильно неизвиняюсь, но "совсем необновляемого запроса" не было даже в первоначальном варианте ТС.
Во что это запрос "тансформировался" у Вас - Ваши личные проблемы.
alexeyvg
sphinx_mv
Поиск в гугле по insert update mssql первой же ссылкой дает чуть ли не все реально возможные (и применяемые) варианты...
Давайте всё таки рассматривать конкретный критикуемый вариант:
UPDATE Categories
SET CategoryID = @CategoryID
WHERE ([CategoryID] = @CategoryID)

Ваши объяснения не пролили свет на задачу, решаемую этой операцией.
Зачем обновлять ПК на то же самое значение, чем эта практика так хороша?
Ваш код - Вы и объясняете а) какой в нем смысл и б) какое он отношение имеет к обсуждаемой теме.

А я тут грешным делом думал, что кое-кто всего лишь "опечатался" в примере, а тут вон оно как - на полном серьезе и крайне настойчиво "требуется обсудить"...
alexeyvg
Критикуют тут именно обновление CategoryID = @CategoryID WHERE CategoryID = @CategoryID, больше ничего.
Вы будете смеяться, но именно этот Ваш вариант не только никто не критикует, но даже не имеет ни малейшего желания обсуждать... И если бы я действительно начал именно его критиковать, меня бы уже давно забанили...
Соотвественно, тролльте, плиз, кого-нибудь более другого в каком-нибудь более другом месте.
За сим раскланиваюсь.
1 апр 13, 22:34    [14123925]     Ответить | Цитировать Сообщить модератору
 Re: Объединение хранимых процедур для вставки и обновления  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
sphinx_mv, если решение ТСа, по-вашему, правильное, скажите, какое значение надо указывать для @CategoryID при добавлении новой записи? и как убедиться, что действительно добавлена новая запись, а не изменена запись, только что добавленная другим пользователем? Ведь вы, как я понял, утверждаете, что предложено хорошее решение...
1 апр 13, 23:04    [14123990]     Ответить | Цитировать Сообщить модератору
 Re: Объединение хранимых процедур для вставки и обновления  [new]
sphinx_mv
Member [заблокирован]

Откуда:
Сообщений: 1672
<тролль мод="он" />

Cygapb-007
sphinx_mv, если решение ТСа, по-вашему, правильное, скажите, какое значение надо указывать для @CategoryID при добавлении новой записи?
Когда (и если) мусье озадачит себя определением термина "новая запись", он автоматически получит ответ на свой вопрос - в четко сформулированном вопросе содержится большая часть правильного ответа.

Кстати, совершенно не понятно, как мусье определяет критерии "правильностью" решения. Соответственно, если нет критериев, то я никак не могу считать решение ТСа ни "правильным", ни "не правильным" в соответствии с ними.
Доказал бы кто еще, что эти критерии вообще можно рассматривать как критерии чего-либо...
Cygapb-007
и как убедиться, что действительно добавлена новая запись, а не изменена запись, только что добавленная другим пользователем?
А как Вы вообще убеждаетесь, что добавляется новая запись (термин, который мусье как-то не удосужился сформулировать), а не редактируется существующая (мусье этот термин тоже "забыл" определить)?
Например, при использовании MERGE? Не слабо ли ответить желательно, внятно и вменяемо?
Cygapb-007
Ведь вы, как я понял, утверждаете, что предложено хорошее решение...
Варианты решений "в общем виде", которые я обычно использую, я уже показывал... Но тут ситуация ГОРАЗДО интереснее: от Вас ожидается решение, ЛУЧШЕЕ, чем "процитированные" мной или хотя бы даже решение, выбраное ТСом - хоть и не лишенное определенных недостатков, но тоже "в принципе" рабочее...

Ну, а с точки зрения "хорошести"/"нехорошести" этого выбранного ТСом решения есть только критерии "устраивает"/"не устраивает". И даже не меня или Вас, а самого ТСа, которому непосредственно и самостоятельно использовать это его собственное решение в его системе.

<тролль мод="офф" />
2 апр 13, 01:15    [14124197]     Ответить | Цитировать Сообщить модератору
 Re: Объединение хранимых процедур для вставки и обновления  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
Не совсем понял режим тролля - вопрос был сформулирован достаточно ясно, но если это не так - могу переформулировать более доступными для понимания словами. Итак:
Работают 2 человека, и оба одновременно хотят добавить отсутствующую сейчас в таблице информацию. Как проверили, что ее нет? Элементарно: оба выполнили SELECT и убедились что нет. Вам ясно, что они подразумевают под термином новая запись? Если нет - напишите, пожуем еще. Далее, оба добавляют свою (разную) информацию о категориях и нажимают кнопку "Сохранить". Внимание, вопрос - будут ли добавлены в таблицу обе записи?
Пояснение. Критерием правильности решения можно считать правильную обработку двух независимых запросов на модификацию данных. С учетом этого определения - мсье Загадочный, вы по-прежнему будете утверждать, что в обсуждаемом варианте будут добавлены обе записи? Если да - очень хотелось бы увидеть значения @CategoryID, сформированные программой для каждого из двух пользователей, одновременно выполнивших команду SELECT * FROM Categories, и увидевших там, к примеру, всего одну запись (т.е. старший номер CategoryID=1)
2 апр 13, 08:36    [14124396]     Ответить | Цитировать Сообщить модератору
 Re: Объединение хранимых процедур для вставки и обновления  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31444
sphinx_mv
Я сильно неизвиняюсь, но "совсем необновляемого запроса" не было даже в первоначальном варианте ТС.

Ээээ, а это?
Денчик
UPDATE Categories
SET CategoryID = @CategoryID,
CategoryName = @CategoryName,
Description = @Description
WHERE ([CategoryID] = @CategoryID)
2 апр 13, 09:39    [14124570]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить