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

Логин

Email:
  Пароль:

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

Поиск

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

Книги по теме

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

Исходник

Автор:

Айвенго

 
Название:

Много-много ID в одной процедуре

Дата: 14 October 2003
Описание: Вдохновленный успехами моего коллеги AL (смотри [CODEPOST ID=46]F_TBL_VALS_FROM_STRING[/CODEPOST]) я решил предоставить другой вариант решения проблемы. Пример не лишен недостатков, но надеюсь, что кому-то он покажется интересным. 
  Разместить ссылку на этот исходник в форуме вы можете вставив в текст сообщения следующую строку: [CODEPOST ID=58]Много-много ID в одной процедуре[/CODEPOST]
Оценка: Проголосовало 1 посетителей, средняя оценка 5.00
Оценить:
  1 Примерная задача: нужно сделать Update для несколькох строк в таблице. То есть например есть таблица Users. Необходимо проапдейтить поле, ну скажем битовое Enabled  для UserID - 1,4,8,10
  2 
  3 Вариант 1. Четыре раза запустить процедуру Update
  4 Вариант 2. [CODEPOST ID=46]F_TBL_VALS_FROM_STRING[/CODEPOST]
  5 
  6 Вариант 3(правильный =)). Воспользоваться возможностями Sql Server 2000: использовать OpenXML.
  7 
  8 Для реализации этого варианта нужно создать маленький XML документ(а проще говоря строку) и передать его в хранимую процедуру в качестве параметра. В данном случае, XML-документ будет выглядеть так:
  9 
 10  string xml_doc ="<ROOT>
 11 		    <User ID="1" />
 12   		    <User ID="4" />
 13   		    <User ID="8" />
 14 		   <User ID="10" />
 15                  </ROOT>";
 16 
 17 (я сознательно опустил некоторые кавычки/слеши для улучшения читаемости )
 18 
 19 Уверен, что сформировать такую строку для настоящего пацана не проблема.
 20 
 21 Так. Далее передаем эту самую строку в хранимую процедуру в виде параметра.Всё!
 22 Осталось написать хранимую процедуру:
 23 
 24 
 25 CREATE PROCEDURE usp_UsersUpdate
 26 @doc varchar(1000), -- Вот он наш XML - документ;содердит колекцию UserID
 27 @Enabled bit    -- Это значение для апдейта
 28 AS
 29 
 30 set nocount on
 31 declare @idoc int
 32 
 33 exec sp_xml_preparedocument @idoc OUTPUT, @doc
 34 
 35 UPDATE Users Set Enabled = @Enabled where UserID 
 36 in
 37 (
 38 
 39 SELECT UserID FROM   
 40 OPENXML (@idoc, '/ROOT/User',2)  WITH (UserID int  '@ID')
 41 
 42 )
 43 
 44 GO
 45 ---------------------------------------------
 46 Плюсы это варианта очевидны(XML и всё такое). Минусы тоже(работает тока на Sql Server 2000)
 47 
 48 Используемая литература:
 49 
 50 SQL Server Books OnLine:
 51 
 52 mk:@MSITStore:C:\Program%20Files\Microsoft%20SQL%20Server\80\Tools\Books\tsqlref.chm::/ts_oa-oz_5c89.htm
 53 
 54 ---------------------------------------------
 55 Для сумлевающихся предлагаю поиграть со следующим кодом:
 56 
 57 (просто скопируй в SQL Query Analyzer и нажми F5)
 58 
 59 
 60 declare @doc varchar(1000)
 61 declare @idoc int
 62 
 63 set @doc ='<ROOT>
 64 		<User ID="1" />
 65 		<User ID="4" />
 66 		<User ID="8" />
 67 		<User ID="16" />
 68 	  </ROOT>'
 69 exec sp_xml_preparedocument @idoc OUTPUT, @doc
 70 
 71 SELECT UserID FROM   
 72 OPENXML (@idoc, '/ROOT/User',2)  WITH (UserID int  '@ID')
 73 
 74 
 75 
 76 
 77 
 78 
 79  
 80 
Вернуться к списку исходников в категории ADO.NET
 
Apartments for Rent

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