|
|
|
 |
 |
Исходник |
 |
|
 |
 |
|
Автор:
|
|
|
Название:
|
Много-много 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 |
|
|
 |
 |
 |
 |
|
|