Двощ, помоги.Чому не хочет работать эта простейшая процедура?CREATE PROCEDURE dbo.CloseRequests AS BEGIN UPDATE Request SET Done =1 ENDGOMS SQL SERVER 2008Почему эта херня не может просто проставить всем строкам в стоблец Done единицу?
слава mssql, процiдурам слава!
У меня так брат умерА по существу помочь не могу что у вас там в 2008 творится ниебу. Мимооракл12с
конкретно mssql не знаю и негде проверить, ставить сие говно себе не хочу. но полез в эти ваши интернеты, т.к. меня смутил синтаксис, особенно слово GO. с одной стороны на msdn go в синтаксисе присутствует, но больше чем один раз как в твоем примере. с другой стороны на интуите статья по процедурам с примерами для mssql говорит следующее:Пример 12.2. Процедура для уменьшения цены товара первого сорта на 10%.CREATE PROC my_proc2ASUPDATE Товар SET Цена=Цена*0.9 WHERE Сорт=’первый’Для обращения к процедуре можно использовать команды:EXEC my_proc2 или my_proc2как видишь никакого go вообще нет. нахуй этот go нужен даже знать не хочу, можешь попробовать.
>>150369597Этот GO нужен скорее всего только для терминального подключения, ибо без него сервер не понимает где у тебя запрос кончается.А по теме становится все еще более запутанно.Я создал для примера еще один битовый столбец и для него эта процедура прекрасно работает...
>>150369022 (OP)Этой командой ты создаёшь хранимую процедуру. Чтобы она сработала, надо запрос на исполнение делать. Что-то типа "EXEC CloseRequests".
>>150369737наверное я догадался. Done ключевое слово небось в том вашем mssql. и именно в контексте процiдуры оно хавается как ключевое слово. в моих mysql чтобы имя столбца не хавалось как ключевое слово надо его экранировать обратными кавычками, типа `Done`. как экранируется в mssql не знат
>>150370179>>150370210Ошибок при компиляции нет, синтаксис правильный, среда грит все ок. Ну и конечно же попробовал экранировать - все тоже самое. Наверное все-таки дело не в запросе, а в таблице. Ибо с другим столбцом процедура отработала как надо.
>>150370491Столбец Done переименуй в vasya - сразу поймешь проблема в столбце или в его имени.
ОП, ладно, вкачусь. Скажи в таблице есть уникальный ключ? ID например для sequences или еще что?
>>150370932Конечно есть, id.
>>150370491Да не надо там ничего экранировать. Изначально у тебя нет процедуры. Ты пишешь: CREATE что-то там. Теперь у тебя есть процедура. Надо её выполнить. Ты пишешь: EXEC что-то там. Хуяк - твоя заранее созданная процедура сработала. В ОП-посте запрос на создание, а не на выполнение. Пиши "EXEC dbo.CloseRequests" и проверяй.
>>150370983Выполнил, но процедура не сработала из-за все той же ошибки.
>>150371049Странно, перепроверил только что, всё работает. Только "GO" удалил.
Ты мудак ебаный, соси мой хуймимо Oracle OCM
Накройняк попробуй самый тупой способ. С помощью цикла for s in(select... перечисли все id а потом для каждого сделай апдейт. Собственно ты выяснишь что говно - код или таблица.
>>150371202я даже в лягуху лезть не стал, GO смутило. На оракле не прокатит, что-то другое ставить лень
>>150371202Дык и я говорю что на другом столбце это все работает. Что может быть не так с тем столбцом, что среда мне такую хуйню пишет? Я просто с нюансами не знаком, поэтому может чего-то не знаю.
>>150371380Ну зацени проект своей таблицы, мы же не знаем, что там у тебя за столбцы.
>>150371400Не знаю как лучше показать, так сойдет?
>>150371464А на accepted прокатывает?
>>150371464Ты уверен что тебе нужно придавать ячейке bit значение 1? Не "True/False" а число? я прост ниебу ваши sql мамонты
>>150371601Хм, да. На Accepted прокатывает.>>150371878Да, уверен. В MS SQL нет True и False.
>>150371947а значения можешь пальнуть таблицы? (мы никому не покажем честно честно блять)
>>150372093Да пожалуйста, тут все равно только внешние ключи.
>>150371947Переименуй Done в Done_, и проверь.
>>150372179Не, ну если сами по себе ячейки апдейтятся (по отдельности), то в принципе разницы не дожно быть. Done вроде в my sql не является частью синтаксиса или функцией. Конечно я ниеебу но гугол говорит что нет. >мимонеОП
>>150372179Все то же самое.
>>150372179я ему это уже предлагал тут>>150370827реакция? нет её.
>>150372277Действительно, у меня битовый столбец с таким же названием корректно заполнился.
>>150372472Im zaebalsya uzhe. Может мне просто создать новый столбец и заполнить его значениями из старого? С этим видимо что-то не так.
>>150372567Попробуй. Покажи ещё настройки столбца напоследок.
>>150372459если всё тоже самое, тогда еще насторожило твое высказывание "тут все равно только внешние ключи". т.е. доне является внешним ключем к чему то в твоей бд. а аксептед ты добавил в таблицу эту несчастную, но аксептед не является внешним ключем ни к какой другой таблице? т.к. столбец то ты добавил а связь половую на него нет. может тут собака порылась? типа трогаешь внешний ключ доне, он заодно райзит доп запросы на другие таблицы, а оно типа запрещено, что и написано в тексте ошибки.
>>150372634
>>150372712Не не, и акксептд и дон - не внешние. Я это написал к тому что никаких важных данных в таблице все равно не видно, ибо одни цыфарки.
>>150372817Слушай, я конечно опять щас хуйню предложу, но допиши ка к этомуUPDATE Request SET Done =1вот этоWHERE 1=1просто по приколу. У меня когда-то давно был случай другой конечн, но смысл был типа если нет where и ни одного условия = запрос на 1 значение. Но это не my sql так что повторюсь, я не знаю как у вас.
>>150373032Не, все так же.
>>150376205Вообще странная хуйня, у тебя по сути вложенных запросов на возвращение каких либо данных нет
>>150376665Пиздец какая странная. Но в итоге я сделал как и хотел. Создал новый столбец, перегнал в него данные из столбца Done и процедура прекрасно работает. Тот столбец видимо поломанный какой-то.
>>150369022 (OP)Uberi go
Аноны, это вообще пушка. Переименовал свежесозданный столбец в Done и снова нихуя не работает. По ходу что-то с этим именем не так.
>>150377728Попробуй экранировать квадратными скобками. Вот так - [Done].
>>150377728А еще - триггеры нигде не ставил? Если есть - проверь запрос на корректность.
>>150378306Триггеры есть, там названия столбцов менял. Работают они тоже нормально.
>>150378424Покажи, почему-то уверен, что у тебя косяк там в них.
>>150378461Первый:CREATE PROCEDURE dbo.DoneList AS BEGINSELECT em.Name AS 'Заявитель', d.Disrepair_name AS 'Неисправность', r.Create_datetime AS 'Дата и время заявки', ex.Name AS 'Исполнитель', r.Execution_date AS 'Дата и время выполнения' FROM Request r, Employees em, Disrepair d, Executor exWHERE r.Employer = em.id AND d.id = r.Disrepair AND ex.id = r.Executor AND r.done__ = 1 AND MONTH(r.Execution_date) = MONTH(GETDATE()) AND YEAR(r.Execution_date) = YEAR(r.Execution_date) ENDGOВторой:CREATE PROCEDURE dbo.RequestCount AS BEGIN SELECT e.Name AS 'Исполнитель', (SELECT COUNT(r.Done__) FROM Request r WHERE r.Executor = e.id AND MONTH(r.Create_datetime) = MONTH(DATEADD(MONTH, -1, GETDATE())) AND YEAR(r.Create_datetime) = YEAR(GETDATE())) AS 'Количество выполненных заявок' FROM Executor e, Request r ENDGO
>>150378947Да, анон, дело в триггере. Во втором. Если его отключить, то все работает. Что в нем не так, скажи пожалуйста?
>>150378947Бля, я тебе не то написал. Сча исправлю.Первый:CREATE TRIGGER dbo.Check_date ON Request AFTER UPDATE AS IF UPDATE (Execution_date)BEGIN DECLARE @exec_date DATETIME DECLARE @acc_date DATETIME SELECT @exec_date = (SELECT r.Execution_date FROM Request r, INSERTED WHERE r.id = INSERTED.id) SELECT @acc_date = (SELECT r.Create_datetime FROM Request r, INSERTED WHERE r.id = INSERTED.id) IF @exec_date < @acc_date BEGIN PRINT 'Дата выполнения не может быть раньше даты приема' ROLLBACK TRANSACTION ENDENDGOВторой:CREATE TRIGGER dbo.Check_done ON Request AFTER UPDATE AS IF UPDATE (Done_)BEGIN DECLARE @accepted BIT DECLARE @done BIT SELECT @accepted = (SELECT r.Accepted FROM Request r, INSERTED WHERE r.id = INSERTED.id) SELECT @done = (SELECT r.Done_ FROM Request r, INSERTED WHERE r.id = INSERTED.id) IF @accepted = 0 AND @done = 1 BEGIN PRINT 'Заявка не принята' ROLLBACK TRANSACTION ENDENDGO
>>150379319Ну вроде все просто, когда ты ставишь ВСЕМ записям Done = 1 то срабатывает триггер, в какой то записи(ях) выполняется условие этого триггера
>>150379319>SELECT @accepted = (SELECT r.Accepted FROM Request r, INSERTED WHERE r.id = INSERTED.id)>SELECT @done = (SELECT r.Done_ FROM Request r, INSERTED WHERE r.id = INSERTED.id)Какой-то из этих двух запросов выдает больше одного значения - из этого ошибка. Хз что за таблица у тебя Inserted. Короче, направление дал - дальше сам давай.
>>150379531Это наверно не таблица, а ввод откуда-то еще.
>>150379531Inserted - это только что вставленное значение, типа ссылки на него.
>>150369597хуй
>>150369022 (OP)СЛАВА УКРАИНЕ
>>150379611Поменяй на after insert если по ТЗ подходит, а если тебе надо после каждого апдейта, то надо что то думать с условием. Ты после своего же апдейта на него нарываешься
>>150379611Ну тогда очевидно, что при апдейте затрагивающем несколько строк всегда будет пиздаляля вылетать. Чини запрос, короче.
>>150379611есть строка, accepted = 0, done = 0. После твоей процедуры Done = 1 но тут же выполняется условие твоего триггера и далее rollback, я не прав?
Можешь курсор забабахать для обработки случаев когда вставленных несколько. Но курсоры - это такое. Лучше архитектуру пересмотреть в целом.
>>150379728>>150379733Спасибо, аноны. Нашлась проблема. Заменил в триггере UPDATE на INSERT и все заработало как надо. По ТЗ подходит, все хорошо.
>>150380038Алилуяудачи брат
>>150369022 (OP)Триггер смотри на request
>>150380038>Заменил в триггере UPDATE на INSERTБлядь, как я вас пионеров ненавижу за это, вы бы знали, как меня заебали такие написаторы SQL методом перебора.
>>150380543Это не метод перебора, не переживай. Была проблема, проблема локализована, проблема исправлена. Да и к тому же базу создавал не я, я ее только исправляю.
>>150380641Забей на очкогорящего, ты лучше вот подумай о чем. Судя по всему эта таблица - таблица состояния заказа или что-то типа того. В ней это состояние заказа обновляется или заменяется новой строкой? если обновляется то триггер был правильным чтобы не допустить статуса "Допущен" (accepted) = 0 при выполненном (done). Сейчас же проверка будет только после создания новой строки, ты уверен что по ТЗ все правильно?
>>150383217Да. После инсерта в полях Accepted и Done никаких апдейтов уже не происходит.Таблица нужна для формирования и обработки заявок пользователей. Когда специалист принимает заявку - в поле Accepted инсертится 1. Когда он выполняет заявку - в поле Done инсертится 1, а в поле Execution_datetime ставится текущее время. После этого к этой строке обращаются только селектом и никак ее не меняют. А процедура нужна только для того чтобы закрыть все не выполненные заявки за прошедший месяц, тупо для отчетности.
>>150383549А ну ок, а то мало ли, окажется что насоветовал хуйни, совесть будет мучать
>>150383768Ну тот анон наверное так и подумал что я хуярю в базу все что аноны мне тут напишут до тех пор пока все не исправится, от чего и забомбил.Спасибо тебе за советы, дружище.
>>150383549> в поле Accepted инсертится 1Инсертится в таблицу. В поля строк - апдейтится. Ты сломал все.
>>150383900Да на здоровье, даж интересно было
>>150384055Ты прав да, но я почему то подумал, что он имеет в виду таблицу состояний, к примеруid, idзаказа, idзаказчика, idисполнителя, idсостояния, dateполучается что таких строк с одним и тем же заказом может быть и много. ОП поправь?
>>150384544>id, idзаказа, idзаказчика, idисполнителя, idсостояния, dateЭто все верно. Только вот одна строка - одна заявка.