[Ответить в тред] Ответить в тред

02/12/16 - Конкурс визуальных новелл доски /ruvn/
15/11/16 - **НОВЫЙ ФУНКЦИОНАЛ** - Стикеры
09/10/16 - Открыта доска /int/ - International, давайте расскажем о ней!

Check this out!

Новые доски: /2d/ - Аниме/Беседка • /wwe/ - WorldWide Wrestling Universe • /ch/ - Чатики и конфочки • /int/ - International • /ruvn/ - Российские визуальные новеллы • /math/ - Математика • Создай свою

[Назад][Обновить тред][Вниз][Каталог] [ Автообновление ] 70 | 5 | 11
Назад Вниз Каталог Обновить

Аноним 06/04/17 Чтв 11:21:11  150369022  
2a3d8a0b.png (6Кб, 665x136)
Двощ, помоги.
Чому не хочет работать эта простейшая процедура?

CREATE PROCEDURE dbo.CloseRequests
AS
BEGIN
UPDATE Request SET Done =1
END
GO

MS SQL SERVER 2008

Почему эта херня не может просто проставить всем строкам в стоблец Done единицу?
Аноним 06/04/17 Чтв 11:23:51  150369134
слава mssql, процiдурам слава!
Аноним 06/04/17 Чтв 11:29:45  150369429
У меня так брат умер

А по существу помочь не могу что у вас там в 2008 творится ниебу. Мимооракл12с
Аноним 06/04/17 Чтв 11:33:04  150369597
конкретно mssql не знаю и негде проверить, ставить сие говно себе не хочу. но полез в эти ваши интернеты, т.к. меня смутил синтаксис, особенно слово GO. с одной стороны на msdn go в синтаксисе присутствует, но больше чем один раз как в твоем примере. с другой стороны на интуите статья по процедурам с примерами для mssql говорит следующее:
Пример 12.2. Процедура для уменьшения цены товара первого сорта на 10%.
CREATE PROC my_proc2
AS
UPDATE Товар SET Цена=Цена*0.9
WHERE Сорт=’первый’

Для обращения к процедуре можно использовать команды:

EXEC my_proc2 или my_proc2

как видишь никакого go вообще нет. нахуй этот go нужен даже знать не хочу, можешь попробовать.
Аноним 06/04/17 Чтв 11:36:03  150369737
>>150369597
Этот GO нужен скорее всего только для терминального подключения, ибо без него сервер не понимает где у тебя запрос кончается.
А по теме становится все еще более запутанно.
Я создал для примера еще один битовый столбец и для него эта процедура прекрасно работает...
Аноним 06/04/17 Чтв 11:44:24  150370179
>>150369022 (OP)
Этой командой ты создаёшь хранимую процедуру. Чтобы она сработала, надо запрос на исполнение делать. Что-то типа "EXEC CloseRequests".
Аноним 06/04/17 Чтв 11:45:06  150370210
>>150369737
наверное я догадался. Done ключевое слово небось в том вашем mssql. и именно в контексте процiдуры оно хавается как ключевое слово. в моих mysql чтобы имя столбца не хавалось как ключевое слово надо его экранировать обратными кавычками, типа `Done`. как экранируется в mssql не знат
Аноним 06/04/17 Чтв 11:50:45  150370491
>>150370179
>>150370210
Ошибок при компиляции нет, синтаксис правильный, среда грит все ок. Ну и конечно же попробовал экранировать - все тоже самое. Наверное все-таки дело не в запросе, а в таблице. Ибо с другим столбцом процедура отработала как надо.
Аноним 06/04/17 Чтв 11:58:38  150370827
>>150370491
Столбец Done переименуй в vasya - сразу поймешь проблема в столбце или в его имени.
Аноним 06/04/17 Чтв 12:01:20  150370932
ОП, ладно, вкачусь. Скажи в таблице есть уникальный ключ? ID например для sequences или еще что?
Аноним 06/04/17 Чтв 12:02:03  150370970
>>150370932
Конечно есть, id.
Аноним 06/04/17 Чтв 12:02:18  150370983
>>150370491
Да не надо там ничего экранировать.
Изначально у тебя нет процедуры. Ты пишешь: CREATE что-то там. Теперь у тебя есть процедура. Надо её выполнить. Ты пишешь: EXEC что-то там. Хуяк - твоя заранее созданная процедура сработала. В ОП-посте запрос на создание, а не на выполнение. Пиши "EXEC dbo.CloseRequests" и проверяй.
Аноним 06/04/17 Чтв 12:03:56  150371049
>>150370983
Выполнил, но процедура не сработала из-за все той же ошибки.
Аноним 06/04/17 Чтв 12:07:23  150371202
blob (18Кб, 461x315)
>>150371049
Странно, перепроверил только что, всё работает. Только "GO" удалил.
Аноним 06/04/17 Чтв 12:08:55  150371279
Ты мудак ебаный, соси мой хуй
мимо Oracle OCM
Аноним 06/04/17 Чтв 12:09:12  150371296
Накройняк попробуй самый тупой способ. С помощью цикла for s in(select... перечисли все id а потом для каждого сделай апдейт. Собственно ты выяснишь что говно - код или таблица.
Аноним 06/04/17 Чтв 12:10:39  150371365
>>150371202
я даже в лягуху лезть не стал, GO смутило. На оракле не прокатит, что-то другое ставить лень
Аноним 06/04/17 Чтв 12:10:59  150371380
>>150371202
Дык и я говорю что на другом столбце это все работает. Что может быть не так с тем столбцом, что среда мне такую хуйню пишет? Я просто с нюансами не знаком, поэтому может чего-то не знаю.
Аноним 06/04/17 Чтв 12:11:22  150371400
>>150371380
Ну зацени проект своей таблицы, мы же не знаем, что там у тебя за столбцы.
Аноним 06/04/17 Чтв 12:12:36  150371464
2211.png (35Кб, 914x507)
>>150371400
Не знаю как лучше показать, так сойдет?
Аноним 06/04/17 Чтв 12:15:24  150371601
>>150371464
А на accepted прокатывает?
Аноним 06/04/17 Чтв 12:21:03  150371878
>>150371464
Ты уверен что тебе нужно придавать ячейке bit значение 1? Не "True/False" а число? я прост ниебу ваши sql мамонты
Аноним 06/04/17 Чтв 12:22:25  150371947
>>150371601
Хм, да. На Accepted прокатывает.
>>150371878
Да, уверен. В MS SQL нет True и False.
Аноним 06/04/17 Чтв 12:24:54  150372093
>>150371947
а значения можешь пальнуть таблицы? (мы никому не покажем честно честно блять)
Аноним 06/04/17 Чтв 12:26:39  150372164
ScreenShot.png (14Кб, 563x206)
>>150372093
Да пожалуйста, тут все равно только внешние ключи.
Аноним 06/04/17 Чтв 12:27:00  150372179
>>150371947
Переименуй Done в Done_, и проверь.
Аноним 06/04/17 Чтв 12:29:14  150372277
>>150372179
Не, ну если сами по себе ячейки апдейтятся (по отдельности), то в принципе разницы не дожно быть. Done вроде в my sql не является частью синтаксиса или функцией. Конечно я ниеебу но гугол говорит что нет. >мимонеОП
Аноним 06/04/17 Чтв 12:33:05  150372459
>>150372179
Все то же самое.
Аноним 06/04/17 Чтв 12:33:10  150372465
>>150372179
я ему это уже предлагал тут>>150370827
реакция? нет её.
Аноним 06/04/17 Чтв 12:33:21  150372472
>>150372277
Действительно, у меня битовый столбец с таким же названием корректно заполнился.
Аноним 06/04/17 Чтв 12:35:06  150372567
>>150372472
Im zaebalsya uzhe. Может мне просто создать новый столбец и заполнить его значениями из старого? С этим видимо что-то не так.
Аноним 06/04/17 Чтв 12:36:26  150372634
>>150372567
Попробуй. Покажи ещё настройки столбца напоследок.
Аноним 06/04/17 Чтв 12:37:54  150372712
>>150372459
если всё тоже самое, тогда еще насторожило твое высказывание "тут все равно только внешние ключи". т.е. доне является внешним ключем к чему то в твоей бд. а аксептед ты добавил в таблицу эту несчастную, но аксептед не является внешним ключем ни к какой другой таблице? т.к. столбец то ты добавил а связь половую на него нет. может тут собака порылась? типа трогаешь внешний ключ доне, он заодно райзит доп запросы на другие таблицы, а оно типа запрещено, что и написано в тексте ошибки.
Аноним 06/04/17 Чтв 12:38:20  150372738
1576ee3b.png (48Кб, 919x720)
>>150372634
Аноним 06/04/17 Чтв 12:39:47  150372817
>>150372712
Не не, и акксептд и дон - не внешние. Я это написал к тому что никаких важных данных в таблице все равно не видно, ибо одни цыфарки.
Аноним 06/04/17 Чтв 12:43:49  150373032
>>150372817
Слушай, я конечно опять щас хуйню предложу, но допиши ка к этому
UPDATE Request SET Done =1
вот это
WHERE 1=1
просто по приколу. У меня когда-то давно был случай другой конечн, но смысл был типа если нет where и ни одного условия = запрос на 1 значение. Но это не my sql так что повторюсь, я не знаю как у вас.
Аноним 06/04/17 Чтв 13:35:23  150376205
>>150373032
Не, все так же.
Аноним 06/04/17 Чтв 13:42:06  150376665
>>150376205
Вообще странная хуйня, у тебя по сути вложенных запросов на возвращение каких либо данных нет
Аноним 06/04/17 Чтв 13:48:09  150377024
>>150376665
Пиздец какая странная. Но в итоге я сделал как и хотел. Создал новый столбец, перегнал в него данные из столбца Done и процедура прекрасно работает. Тот столбец видимо поломанный какой-то.
Аноним 06/04/17 Чтв 13:49:22  150377098
>>150369022 (OP)
Uberi go
Аноним 06/04/17 Чтв 13:58:58  150377728
Аноны, это вообще пушка. Переименовал свежесозданный столбец в Done и снова нихуя не работает. По ходу что-то с этим именем не так.
Аноним 06/04/17 Чтв 13:59:54  150377798
>>150377728
Попробуй экранировать квадратными скобками. Вот так - [Done].
Аноним 06/04/17 Чтв 14:08:24  150378306
>>150377728
А еще - триггеры нигде не ставил? Если есть - проверь запрос на корректность.
Аноним 06/04/17 Чтв 14:10:22  150378424
>>150378306
Триггеры есть, там названия столбцов менял. Работают они тоже нормально.
Аноним 06/04/17 Чтв 14:10:53  150378461
>>150378424
Покажи, почему-то уверен, что у тебя косяк там в них.
Аноним 06/04/17 Чтв 14:18:45  150378947
>>150378461
Первый:
CREATE PROCEDURE dbo.DoneList
AS
BEGIN
SELECT 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 ex
WHERE 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)
END
GO

Второй:
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

END
GO
Аноним 06/04/17 Чтв 14:22:13  150379151
>>150378947
Да, анон, дело в триггере. Во втором. Если его отключить, то все работает. Что в нем не так, скажи пожалуйста?
Аноним 06/04/17 Чтв 14:25:09  150379319
>>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
END
END
GO

Второй:
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
END
END
GO
Аноним 06/04/17 Чтв 14:28:23  150379515
>>150379319
Ну вроде все просто, когда ты ставишь ВСЕМ записям Done = 1 то срабатывает триггер, в какой то записи(ях) выполняется условие этого триггера
Аноним 06/04/17 Чтв 14:28:33  150379531
>>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. Короче, направление дал - дальше сам давай.
Аноним 06/04/17 Чтв 14:29:41  150379599
>>150379531
Это наверно не таблица, а ввод откуда-то еще.
Аноним 06/04/17 Чтв 14:29:50  150379611
>>150379531
Inserted - это только что вставленное значение, типа ссылки на него.
Аноним 06/04/17 Чтв 14:30:36  150379650
>>150369597
хуй
Аноним 06/04/17 Чтв 14:30:54  150379672
>>150369022 (OP)
СЛАВА УКРАИНЕ
Аноним 06/04/17 Чтв 14:31:52  150379728
>>150379611
Поменяй на after insert если по ТЗ подходит, а если тебе надо после каждого апдейта, то надо что то думать с условием. Ты после своего же апдейта на него нарываешься
Аноним 06/04/17 Чтв 14:31:57  150379733
>>150379611
Ну тогда очевидно, что при апдейте затрагивающем несколько строк всегда будет пиздаляля вылетать. Чини запрос, короче.
Аноним 06/04/17 Чтв 14:33:51  150379858
>>150379611
есть строка, accepted = 0, done = 0. После твоей процедуры Done = 1 но тут же выполняется условие твоего триггера и далее rollback, я не прав?
Аноним 06/04/17 Чтв 14:35:36  150379985
Можешь курсор забабахать для обработки случаев когда вставленных несколько. Но курсоры - это такое. Лучше архитектуру пересмотреть в целом.
Аноним 06/04/17 Чтв 14:36:22  150380038
>>150379728
>>150379733
Спасибо, аноны. Нашлась проблема. Заменил в триггере UPDATE на INSERT и все заработало как надо. По ТЗ подходит, все хорошо.
Аноним 06/04/17 Чтв 14:37:28  150380101
>>150380038
Алилуя
удачи брат
Аноним 06/04/17 Чтв 14:42:44  150380414
>>150369022 (OP)
Триггер смотри на request
Аноним 06/04/17 Чтв 14:44:34  150380543
>>150380038
>Заменил в триггере UPDATE на INSERT

Блядь, как я вас пионеров ненавижу за это, вы бы знали, как меня заебали такие написаторы SQL методом перебора.
Аноним 06/04/17 Чтв 14:46:11  150380641
>>150380543
Это не метод перебора, не переживай. Была проблема, проблема локализована, проблема исправлена. Да и к тому же базу создавал не я, я ее только исправляю.
Аноним 06/04/17 Чтв 15:27:25  150383217
>>150380641
Забей на очкогорящего, ты лучше вот подумай о чем. Судя по всему эта таблица - таблица состояния заказа или что-то типа того. В ней это состояние заказа обновляется или заменяется новой строкой? если обновляется то триггер был правильным чтобы не допустить статуса "Допущен" (accepted) = 0 при выполненном (done). Сейчас же проверка будет только после создания новой строки, ты уверен что по ТЗ все правильно?
Аноним 06/04/17 Чтв 15:33:20  150383549
>>150383217
Да. После инсерта в полях Accepted и Done никаких апдейтов уже не происходит.
Таблица нужна для формирования и обработки заявок пользователей. Когда специалист принимает заявку - в поле Accepted инсертится 1. Когда он выполняет заявку - в поле Done инсертится 1, а в поле Execution_datetime ставится текущее время. После этого к этой строке обращаются только селектом и никак ее не меняют. А процедура нужна только для того чтобы закрыть все не выполненные заявки за прошедший месяц, тупо для отчетности.
Аноним 06/04/17 Чтв 15:36:37  150383768
>>150383549
А ну ок, а то мало ли, окажется что насоветовал хуйни, совесть будет мучать
Аноним 06/04/17 Чтв 15:38:48  150383900
>>150383768
Ну тот анон наверное так и подумал что я хуярю в базу все что аноны мне тут напишут до тех пор пока все не исправится, от чего и забомбил.
Спасибо тебе за советы, дружище.
Аноним 06/04/17 Чтв 15:41:19  150384055
>>150383549
> в поле Accepted инсертится 1

Инсертится в таблицу. В поля строк - апдейтится. Ты сломал все.
Аноним 06/04/17 Чтв 15:49:20  150384464
>>150383900
Да на здоровье, даж интересно было
Аноним 06/04/17 Чтв 15:51:05  150384544
>>150384055
Ты прав да, но я почему то подумал, что он имеет в виду таблицу состояний, к примеру
id, idзаказа, idзаказчика, idисполнителя, idсостояния, date
получается что таких строк с одним и тем же заказом может быть и много. ОП поправь?
Аноним 06/04/17 Чтв 16:03:55  150385314
>>150384544
>id, idзаказа, idзаказчика, idисполнителя, idсостояния, date
Это все верно. Только вот одна строка - одна заявка.

[Назад][Обновить тред][Вверх][Каталог] [Реквест разбана] [Подписаться на тред] [ ] 70 | 5 | 11
Назад Вверх Каталог Обновить

Топ тредов
Избранное