Rambler's Top100
Главная
Новости
Статьи
Форумы
Книги
Коды
Сообщество
Блоги
О нас
 

Логин

Email:
  Пароль:

Войти
Зарегистрироваться
Забыл пароль

Поиск

 Искать :
 
Вперед

Книги по теме

Искать:
в:
Порядок:

Исходник

Автор:

Айвенго

 
Название:

Много-много ID да плюс параметры в одной процедуре

Дата: 15 October 2003
Описание: Задача: В одной процедуре необходимо сделать UPDATE/INSERT/DELETE для нескольких строк таблицы сразу. Данный код является расширение моего предыдущего исходника (смотри исходник "Много-много ID в одной процедуре размещен Айвенго 14 октября" 2003 г. ) 
  Разместить ссылку на этот исходник в форуме вы можете вставив в текст сообщения следующую строку: [CODEPOST ID=59]Много-много ID да плюс параметры в одной процедуре[/CODEPOST]
Оценка: Проголосовало 4 посетителей, средняя оценка 4.75
Оценить:
ЗАДАЧА: на основе XML определенного вида сделать INSERT/UPDATE для таблицы Users
И так. Предполжим, что наша таблицы Users выглядит так:

Create table Users
(UserID int, FirstName varchar(50), LastName varchar(50))

Нужно в одной хранимой процедуре добавить сразу три записи.(можно и триста)
Тогда, передаваемый в виде параметра в хр. процедуру XML будет выглядеть следующим образом:

<root>
<User ID="1" FirstName="Ivan" LastName="Ivanov" />
<User ID="2" FirstName="Peter" LastName="Peterov" />
<User ID="3" FirstName="Alex" LastName="Alexeeff" />
<root>

Вот хранимая процеруда, которая добавит записи в таблицу:

CREATE PROCEDURE usp_UsersInsert
@doc varchar(1000) -- Вот он наш XML - документ;
AS
set nocount on
declare @idoc int
exec sp_xml_preparedocument @idoc OUTPUT, @doc
INSERT INTO Users(UserID, FirstName, LastName)
SELECT UserID, FirstName, LastName FROM
OPENXML (@idoc, '/ROOT/User',2)
WITH (UserID int '@ID', FirstName varchar(50) '@FirstName', LastName varchar(50) '@LastName' )

-----------------------------------------------------------
Так. Теперь попробуем сделать процедуру UPDATE
В качестве параметра опять будем передавать такой XML :

<root>
<User ID="1" FirstName="Ivan-2" LastName="Ivanov-2" />
<User ID="2" FirstName="Peter-2" LastName="Peterov-2" />
<User ID="3" FirstName="Alex-2" LastName="Alexeeff-2" />
<root>

Вот она:

CREATE PROCEDURE usp_UsersUpdate
@doc varchar(1000) -- Вот он наш XML - документ;
AS
set nocount on
declare @idoc int

exec sp_xml_preparedocument @idoc OUTPUT, @doc

--Cоздадим временную хран. процедуру и запишем туда данные из XML

Create table #Users
(UserID int, FirstName varchar(50), LastName varchar(50))

INSERT INTO #Users(UserID, FirstName, LastName)
SELECT UserID, FirstName, LastName FROM
OPENXML (@idoc, '/ROOT/User',2)
WITH (UserID int '@ID', FirstName varchar(50) '@FirstName', LastName varchar(50) '@LastName' )

-- Теперь сам запрос на Update с использованием данных, полученных из временной таблицы

UPDATE Users SET FirstName = tu.FirstName, LastName = tu.LastName
FROM #Users tu
WHERE Users.UserID = tu.UserID

------------------------------------------------
Уверен, что о том как сделать DELETE все уже догадались=)


В заключении хочу обратить внимание почтенной публики, что
1) XML - регистрозависимый. Будьте бдительны!
2) XML может быть более сложной структуры.
3) XML - это весело и просто =)

Литература таже:
SQL Server Books OnLine:

mk:@MSITStore:C:\Program%20Files\Microsoft%20SQL%20Server\80\Tools\Books\tsqlref.chm::/ts_oa-oz_5c89.htm

---------------------------------------------
И снова для сумлевающихся предлагаю поиграть со следующим кодом:

(просто скопируй в SQL Query Analyzer и нажми F5)


declare @doc varchar(1000)
declare @idoc int

set @doc ='<ROOT>
<User ID="1" />
<User ID="4" />
<User ID="8" />
<User ID="16" />
</ROOT>'
exec sp_xml_preparedocument @idoc OUTPUT, @doc

SELECT UserID FROM
OPENXML (@idoc, '/ROOT/User',2) WITH (UserID int '@ID')



Вернуться к списку исходников в категории ADO.NET
 
Apartments for Rent

Rambler's Top100
Рейтинг@Mail.ru
Идея: Dimon aka Manowar Программирование: Dimon aka Manowar Дизайн: Dan Lebedev
Хостинг от компании Parking.ru
Карта сайта