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

Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
|
08.04.2001, 21:27
|
|||
|---|---|---|---|
Вставка записей с помощью INSERT |
|||
|
#18+
Уважаемые господа. Помогите "чайнику". Часть 2. При прохождении по записям таблицы в курсоре, в зависимости от условия, запись должна быть либо сохранена, либо удалена, а вместо нее должны быть добавлены записи (как правило несколько), возвращаемые пользовательской функцией СписаниеТовараFIFO(). Используется синтаксис : INSERT INTO @ЖурналПартий SELECT * FROM СписаниеТовараFIFO(@КодДвижения) Проблема в том, что при этом часть возвращаемых функцией записей добавляется не в конец таблицы, а вставляется вместо записи. В материалах конференции прочел, что такое возможно. В описании INSERT в Books Online не нашел ничего по этому поводу (видимо плохо искал... извините). Подскажите: 1) Как заставить INSERT добавлять все записи в конец таблицы? 2) Можно ли заставить INSERT вставлять все записи вместо удаленной? Заранее благодарен ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
09.04.2001, 10:10
|
|||
|---|---|---|---|
Вставка записей с помощью INSERT |
|||
|
#18+
В чем Ваша ошибка - Вы работаете с записями, а надо работать с данными. Мне лично всё равно в какое место вставляются записи и нормального SQL-программиста это тоже не должно волновать. Поэтому и в Books Online по этому поводу ничего и нет. Объясните - зачем Вам-то это? И еще совет - в течении первого года работы через SQL не пользуйтесь курсорами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
09.04.2001, 14:07
|
|||
|---|---|---|---|
Вставка записей с помощью INSERT |
|||
|
#18+
Согласен с SergSuper. Просто немного уточню. Начала и конца таблицы (как в XBase-подобных инструментариях) в MS SQL Server не существует. Если нет клатерного индекса, можно считать, что программисту не интересно, в каком порядке физически располагаются записи в таблицу. Если клатерный индекс есть, то записи при добавлении в таблицу располагаются физически в порядке, заданном кластерным индексом (а не в начало или в конец). Выбрать записи из таблицы можно в любом порядке - как в порядке следования записей, так и в любом другом. лишь бы были поля для сортировки. Insert просто добавляет записи. То, что ты называешь "вставить вместо..." называется изменением сушествующих записей (update). Update не изменяет количество записей. Если тебе нужно, чтобы вместо одной записи появилось десять других, то можешь сначала удалить запись, а потом добавить 10 тебе нужных. И еще совет. Почитай книжку по SQL ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
11.04.2001, 04:13
|
|||
|---|---|---|---|
Вставка записей с помощью INSERT |
|||
|
#18+
Излагаю задачу более детально. Имеется таблица @ЖурналПартий ID | Quantity | Flag __ | ________ | ____ 76 | 10 | 1 18 | 20 | 0 55 | 30 | 1 По ней собственно и движемся в курсоре. Если Flag = 1 то дублируем запись (по идее она должна стать последней в таблице) и удаляем оригинал. Если Flag = 0 то удаляем оригинал и добавляем в таблицу записи, возвращенные пользовательской функцией, в данном случае она возвращает: ID | Quantity | Flag __ | ________ | ____ 18 | 25 | 1 18 | 27 | 1 Таким образом движение в курсоре будет продолжаться до тех пор пока Flag у всех записей не будет равен 1. В результате надеюсь получить следующий набор записей: ID | Quantity | Flag __ | ________ | ____ 76 | 10 | 1 18 | 25 | 1 18 | 27 | 1 55 | 30 | 1 А вместо этого получаю нечто вроде: ID | Quantity | Flag __ | ________ | ____ 76 | 10 | 1 18 | 25 | 1 55 | 30 | 1 18 | 27 | 1 Т.е порядок следования записей нарушен. А именно он и важен в данном случае. Для правильной сортировки пришлось бы пристегивать еще две таблицы, и делать это по ходу несколько раз, а это сложнее того метода, которым пользуюсь я сейчас: Данные просто добавляются не в ту же самую таблицу, а в другую, что не очень красиво и довольно запутано, но работает. 2SergSuper: Каким образом без курсора получить из тех же исходных данных следующий результат: Имеется таблица @ЖурналПартий ID | Quantity __ | ________ 76 | 10 18 | 20 55 | 30 И @Остаток = 55 Требуется получить: ID | Quantity | Balance __ | __ | ____ 76 | 10 | 5 18 | 20 | 20 55 | 30 | 30 Прочитав Ваш ответ по поводу "Нарастающего итога" в конференции, пришел к выводу, что сделать это, наверное возможно, но как пока не додумал, хотя решение судя по всему простое. Помогите, если не надоело возиться. В любом случае спасибо! 2Garya: >Если тебе нужно, чтобы вместо одной записи появилось десять других, то можешь сначала удалить запись, а потом добавить 10 тебе нужных. Именно это и нужно. Удаляю, добавляю десять других, но порядок записей при этом нарушается. А он то в данном случае и важен. Что касается физического расположения записей, то @ЖурналОпераций - переменная типа table, так что, насколько я понимаю, о кластерном индексе речь идти не может. А книжки по SQL читаю, наряду с конференцией SQL.RU, в том числе и Вашими ответами. Чем упрекать в невежестве (справедливо!) - помоги по сути дела. Thanks ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
11.04.2001, 10:12
|
|||
|---|---|---|---|
Вставка записей с помощью INSERT |
|||
|
#18+
2 Andrew Как я уже, писал порядок в таблице не имеет значения. Это просто некие данные. Чтобы их упорядочить надо некий ключ, по которому они будут упорядочиваться. Судя по всему ID для этого не подходит, значит надо еще какое-то поле(время,день, месяц, порядковый номер или еще что-то, вам виднее). Когда вы его добавите - сразу будет понятно. Я помочь не могу пока не знаю что это за поле - это ведь может быть, допустим, день, а за день может быть несколько записей. На самом деле задачи с нарастающим итогом иногда быстрее работают через курсор. Но я всё равно советую им пока не пользоваться - это кажется просто и напоминает работу в процедурных языках, но не приучает работать правильно, используя "мощь" SQL. Помню когда я только начинал писать на SQL была такая задача: есть таблица с остатками по счету на каждый. Вдруг задним числом проходит проводка и остаток за этот день и все последующие надо изменить на сумму проводки. До этого у меня было такое было написано на BP7 & ParadoxEngine. Естественно там искалась первая нужная запись, потом в цикле по индексу записи обновлялись и т.д. Что-то подобное хотелось написать и на SQL. Хорошо что в 4-й версии не было курсоров. Сейчас это кажется привычным, но я тогда поразился что можно вместо циклов просто написать update State set saldo=saldo+10 where acc='322' and date>='19651031' С приветом Сергей, если что можно по почте или Аське sergsuper@mail.ru PS. На 80% уверен что Вам этот нарастающий итог не нужен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
11.04.2001, 11:22
|
|||
|---|---|---|---|
Вставка записей с помощью INSERT |
|||
|
#18+
Насколько я понял, речь идет о правильном списании товаров по методу FIFO (первым пришел - первым ушел). Если было несколько приходных партий по разным ценам по порядку 2шт+10шт+12шт, то при выбытии 18шт должны выбыть 2шт из первой партии (полностью) по цене первой партии, 10шт по цене второй партии (тоже полностью) и 6шт по цене третьей партии (причем, из этой парии должно уйти только 6 шт, и 6шт должно остаться). Порядок следования партий должен быть чем-то задан - и тут я согласен с SergSuper. Это должен быть либо код партии - порядок задается последовательно увеличивающимися кодами партий, либо датой и временем прихода партии (без времени не обойтись, поскольку в один день теоретически возможен приход от разных поставщиков разных партий одного товара по разным ценам). Не совсем понял назначение флага в твоей таблице. В рассылке Александра Гладченко "MS SQL Server - дело тонкое" был пример с нумерацией записей без курсора (через два знака равенства). Однако, как решить конкретно эту задачу аналогичным методом, я дотумкать не смог. Может, кто головастый подскажет. А может, задачка только с помощью курсора и решается. Точнее, есть вариант без курсора - в цикле модифицировать только одну отфильтрованную запись. Однако, IMHO, этот вариант будет медленнее работать, чем вариант с курсором. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|

start [/forum/topic.php?fid=46&mobile=1&tid=1827026]: |
0ms |
get settings: |
8ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
32ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
37ms |
get tp. blocked users: |
1ms |
| others: | 228ms |
| total: | 340ms |

| 0 / 0 |
