2013-04-01 2 views
0

У меня есть две хранимые процедуры: одна для INSERT и вторая для Update, и я бы хотел объединить их в одну, чтобы вы могли сказать мне, какое приложение мне следует использовать для этого?Как слить две хранимые процедуры

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) 

пойти

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 

GO

+0

Вторая процедура кажется неполной – praveen

+0

В следующей версии SQL Server будут удалены типы данных '* text,' text' и 'image'. Избегайте использования этих типов данных в новых разработках и планируйте изменять приложения, которые в настоящее время их используют. Вместо этого используйте 'nvarchar (max)', 'varchar (max)' и 'varbinary (max)'. *] (Http://msdn.microsoft.com/en-us/library/ms187993.aspx) –

+0

Исправлено сейчас)))) –

ответ

1

Здесь вы можете объединить два магазина процедуру код ниже образом, передавая значение @Mode ..

/* 
For Insert 
exec Tools @Mode='Insert', @CategoryID='1', @CategoryName='DemoCat', @Description='demoDesc' 

For Update 
exec Tools @Mode='UPDATE', @CategoryID='1', @CategoryName='DemoCatupdate', @Description='demoDescupdate' 

*/ 

CREATE PROCEDURE Tools 
(
    @Mode nvarchar(100), -- Use for insert or Update 
    @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 [dbo].[Categories] 
      SET [CategoryID] = @CategoryID, 
       [CategoryName] = @CategoryName, 
       [Description] = @Description 
     WHERE ([CategoryID] = @CategoryID) 
    END 
END 
go 
+0

Получение следующего: Сервер: Msg 170, Уровень 15, Состояние 1, Инструменты процедуры, Строка 4 Строка 4: Неправильный синтаксис рядом с '@CategoryID'. Сервер: Msg 137, уровень 15, состояние 1, инструменты процедуры, строка 11 Должен объявить переменную '@Mode'. Сервер: Msg 137, уровень 15, состояние 1, инструменты процедуры, строка 14 Должен объявить переменную '@CategoryID'. Сервер: Msg 137, уровень 15, состояние 1, инструменты процедуры, строка 16 Должен объявить переменную '@Mode'. Сервер: Msg 137, уровень 15, состояние 1, инструменты процедуры, строка 19 Должен объявить переменную '@CategoryID'. –

+0

повторите попытку с вышеуказанным запросом –

+0

Сервер: Msg 156, уровень 15, состояние 1, инструменты процедуры, строка 22 Неверный синтаксис рядом с ключевым словом «ГДЕ». –

0

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

http://msdn.microsoft.com/en-us/library/bb510625(v=sql.100).aspx

Одно замечание, хотя - в то время как я люблю заявление MERGE, там, кажется, increasing number of bugs был найден с ним. Я предлагаю не использовать его, если вы не понимаете, что делаете (нет программирования культа груза), и рассмотрели проблемы, чтобы увидеть, включен ли ваш сценарий.

Смежные вопросы