|
|
|
Добавление записей
|
|||
|---|---|---|---|
|
#18+
ASA8 Существует таблица вида: MyTable(nPrimaryID integer, strString varchar(20), nAnotherID integer). В хранимую процедуру Proc(in _nAnotherID integer, in _strString long varchar) передается идентификатор _nAnotherID и строка вида "'str1', 'str2', 'str3', 'str4'". Задача: привести содержимое MyTable по идентификатору nAnotherID в соответствие с этой строкой. Поясню: в MyTable есть записи: nPrimaryID strString nAnotherID 1 aaa 2 2 bbb 2 3 ccc 2 4 ddd 2 5 zzz 3 При выполнении в Proc с аргументами: Proc(2, str), где str = "'bbb', 'ddd', 'eee', 'fff'" должно получиться следущее: nPrimaryID strString nAnotherID 2 bbb 2 4 ddd 2 5 zzz 3 6 eee 2 7 fff 2 т.е. удалиться записи со strString, не содержащимися в переданном аргументе и добавиться новые, ранее не содержащиеся в Table для данного nAnotherID. Удаление производиться довольно просто: delete from table MyTable where nAnotherID = _nAnotherID and strString not in (_strString); Как можно произвести добавление записей с новыми strString (в приведенном выше примере 'eee' и 'fff')? Желательно без создания временных таблиц? Заранее благодарю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2004, 18:55 |
|
||
|
Добавление записей
|
|||
|---|---|---|---|
|
#18+
авторУдаление производиться довольно просто: delete from table MyTable where nAnotherID = _nAnotherID and strString not in (_strString); Гм, ну во первых так вообще то ничего не удалится, похорошему уж надо писать: Код: plaintext 1. 2. 3. Добавление можно и без временной таблицы, если очень хочется - делаете цикл WHILE LOOP ... END LOOP , внутри через функцию CharIndex последовательно выщемляете по разделителю все значения из параметра _strString, и если их нет, то добавляете в таблицу посредством Код: plaintext 1. 2. Ну и вообще хотелось бы узнать, с чего навеяна такая странная форма передачи параметров - действительно обоснованной необходимостью или же просто неопытностью или не знанием правил проектировки в ASA ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.05.2004, 02:19 |
|
||
|
Добавление записей
|
|||
|---|---|---|---|
|
#18+
ASCRUS Гм, ну во первых так вообще то ничего не удалится, похорошему уж надо писать: Код: plaintext 1. 2. 3. 4. Вы абсолютно правы. Я скопировал пример не оттуда =) ASCRUS Кстати не понятно, почему у Вас выжило "zzz" в последнем примере. nAnotherID у записи "zzz" равняется 3, тогда как переданный параметр _nAnotherID равен 2. Запись с "zzz" и не должна была трогаться. ASCRUS Добавление можно и без временной таблицы, если очень хочется - делаете цикл WHILE LOOP ... END LOOP, внутри через функцию CharIndex последовательно выщемляете по разделителю все значения из параметра _strString, и если их нет, то добавляете в таблицу посредством Код: plaintext 1. 2. 3. Т.е., насколько я понял, крутясь в цикле, я нахожу индекс первого вхождения запятой (в данном случае она является разделителем) с помощью CHARINDEX, формирую параметр от 1 до значения, выданного функцией, используя SUBSTRING и произвожу вставку приведенным вами INSERT? Затем формирую остаток строки SUBSTRINGом и повторяю действия снова до тех пор, пока не кончатся разделители? Если я все правильно понял, то это именно то, что мне надо было =). Правда вставку, как мне кажется, лучше производить следующим выражением, оно быстрее: Код: plaintext 1. 2. 3. 4. 5. ASCRUS Выглядит это решение честно говоря кошмарно, про оптимизацию я вообще молчу, но работать конечно же будет :) Хотя я бы порекомендовал перед тем как его писать задасться одним маленьким вопросом - а на кой параметры в ХП передавать в виде стринговой строки с разделителем ? Может их легче на клиенте подготавливать до удобочитаемого вида, чем заниматься такими извратами с точки зрения СУБД ? Приведенный выше пример - частный случай из следующей задачи: В web-клиенте отображается набор записей. Пользователь по каким-либо правилам и просто так может пометить множество записей, над которым надо произвести какие-либо действия, с помощью checkbox. В основном это изменение или удаление группы записей. Я вижу реализацию двумя вариантами: 1) Дергается ХП N-ое количество раз, изменяя или удаляя одну запись за каждый вызов. 2) В ХП передается строка, содержащая набор параметров (напр. идентификаторов), разделенных запятой, а в ХП выполняется что-то типа (упрощенно) Код: plaintext 1. 2. Код: plaintext 1. 2. 3. Но иногда возникают сложности при использовании данного метода (хочется придерживаться унифицированного интерфейса между клиентом и ХП для групповых операций), иллюстрированные приведенным выше примером (иногда требуется вставка строк с недостающими значениями). ASCRUS Ну и вообще хотелось бы узнать, с чего навеяна такая странная форма передачи параметров - действительно обоснованной необходимостью или же просто неопытностью или не знанием правил проектировки в ASA ? Я оставлю это на ваше усмотрение, тем не менее мне очень интересно узнать альтернативы решения в контексте данной задачи, возможно они очень облегчат мою жизнь =) Заранее благодарю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.05.2004, 12:49 |
|
||
|
Добавление записей
|
|||
|---|---|---|---|
|
#18+
авторПриведенный выше пример - частный случай из следующей задачи: В web-клиенте отображается набор записей. Пользователь по каким-либо правилам и просто так может пометить множество записей, над которым надо произвести какие-либо действия, с помощью checkbox. В основном это изменение или удаление группы записей. Сам я вебом не занимался, но на вскидку предложил бы сделать через динамический SQL вот так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. Код: plaintext 1. 2. 3. 4. 5. 6. P.S. Для 9-ой версии ASA можно будет еще добиться увеличения скорости ХП, указав в описании темповой таблицы вместо "ON COMMIT PRESERVE ROWS" опцию "NOT TRANSACTIONAL". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.05.2004, 18:39 |
|
||
|
Добавление записей
|
|||
|---|---|---|---|
|
#18+
Действительно, великолепная идея! =) В случае, когда выполняемое действие отличается от простых UPDATE и DELETE над множеством (WHERE IN) значений, когда приходится парсить строку, вместо того, делать это на стороне сервера и заполнять временную таблицу и/или выполнять некий набор действий над ней, можно отдать это на откуп клиенту! Можно развить вашу мысль в сторону большей универсальности (т.к. могут меняться набор и типы данных в таблицах): В подобных случаях можно использовать в интерфейсе между клиентом и ХП эмуляцию массива данных, представляющую собой таблицу #Array с единственным строковым полем (напр. varchar(64)). В клиенте мы формируем батч SQL-скрипт вставки в таблицу #Array на все помеченные значения в виде строковых параметров, а ХП заполняет ее и может выполнять над ней любой набор действий, в особо тяжелых случаях даже пробегаться курсором, при необходимости "кастуя" (CAST) строки к необходимому (ожидаемому) типу данных (целое, дата/время и т.д.). Большое спасибо, мне было нужно именно такое решение! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2004, 11:45 |
|
||
|
|

start [/forum/search_topic.php?author=aleksanderat&author_mode=last_posts&do_search=1]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
171ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
40ms |
get tp. blocked users: |
1ms |
| others: | 694ms |
| total: | 965ms |

| 0 / 0 |

Извините, этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
... ля, ля, ля ...