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