Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Ошибка в ALTER TABLE / 17 сообщений из 17, страница 1 из 1
13.12.2021, 17:20
    #40119687
gerzzog
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в ALTER TABLE
Приветствую всех.
У меня выбивает ошибку при попытке создать константу в ALTER TABLE, так как хочу сослаться на переменную.
А пробую создать динамическое подключение, чтобы обойти этот момент, но что-то не получается. Так как если ставлю значение default (0) или любую дату в константу - все работает.
Мой код здесь:
https://pastebin.com/p0xqbQMC
Принцип кода таков:
1. Выбираю дату в текущем месяце (обычно 1 число текущего месяца)
2. Высчитываю количество дней между 1 число и сегодняшней датой и записываю этот перечень в таблицу.
3. Создаю таблицу для выгрузки данных из процедуры процедуры, которая высчитывает поступления по дням.
4. Создаю курсор (это не обязательно, просто хотел потренироваться, до этого ни разу его не использовал)
и перебираю даты из текущего месяца.
5. Поскольку процедура get_otchet создана не мной и доступа к ней я не имею, в ней нет даты формирования отчета (за какой день).
Я хочу в конце всех данных, которая выгружает процедура в таблицу вставить дату, за которую был сформирован отчет.

В общем по итого у меня ошибка Msg 3728, Level 16, State 1, Line 58
'df_datecurra' is not a constraint.
Msg 3727, Level 16, State 0, Line 58
Could not drop constraint. See previous errors.


Может у Вас есть идеи?
...
Рейтинг: 0 / 0
13.12.2021, 17:27
    #40119692
msLex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в ALTER TABLE
gerzzog,

Запрос не смотрел, но первый шаг при отладке динамических запросов - это их вывод на экран (print @sql) вместо выполнения
...
Рейтинг: 0 / 0
13.12.2021, 17:38
    #40119696
gerzzog
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в ALTER TABLE
msLex,
попробовал - первый раз, когда проганяет запрос - четко показывает. Потом идет ошибка и на второй заход
цикл не идет
Ошибка:
Msg 3728, Level 16, State 1, Line 59
'df_datecurra' is not a constraint.
Msg 3727, Level 16, State 0, Line 59
Could not drop constraint. See previous errors.
...
Рейтинг: 0 / 0
13.12.2021, 17:43
    #40119697
gerzzog
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в ALTER TABLE
gerzzog
msLex,
попробовал - первый раз, когда проганяет запрос - четко показывает. Потом идет ошибка и на второй заход
цикл не идет
Ошибка:
Msg 3728, Level 16, State 1, Line 59
'df_datecurra' is not a constraint.
Msg 3727, Level 16, State 0, Line 59
Could not drop constraint. See previous errors.


Но опять же. Если поставить дефолтное значение 0 или любую дату - все сформирует
...
Рейтинг: 0 / 0
13.12.2021, 17:50
    #40119701
msLex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в ALTER TABLE
А, у вас констрейнт создается динамически, а удаляется обычным кодом.

Так не выйдет , оберните ALTER TABLE #tmpBusicasapodnyam1 DROP CONSTRAINT df_datecurra в EXEC ('...')
...
Рейтинг: 0 / 0
13.12.2021, 17:57
    #40119704
gerzzog
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в ALTER TABLE
msLex,
я пробовал. Дописал этот код:
SET @sql_str ='alter table #tmpBusicasapodnyam1 drop constraint df_datecurra'
EXEC(@sql_str)
Не помогает, к сожалению. Все та же ошибка.
...
Рейтинг: 0 / 0
13.12.2021, 17:58
    #40119705
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в ALTER TABLE
gerzzog,

ALTER TABLE не создаёт никаких констант.

автор2. Высчитываю количество дней между 1 число и сегодняшней датой и записываю этот перечень в таблицу.
Это что за поток сознания? Количество дней - это единственное число, а не список.

авторСоздаю таблицу для выгрузки данных из процедуры процедуры
WTF процедура процедуры?
...
Рейтинг: 0 / 0
13.12.2021, 18:04
    #40119706
gerzzog
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в ALTER TABLE
Владислав Колосов
gerzzog,

ALTER TABLE не создаёт никаких констант.

автор2. Высчитываю количество дней между 1 число и сегодняшней датой и записываю этот перечень в таблицу.

Это что за поток сознания? Количество дней - это единственное число, а не список.

авторСоздаю таблицу для выгрузки данных из процедуры процедуры
WTF процедура процедуры?

Сначала высчитываю количество дней потом отдельно загоняю даты в таблицу. Это два отдельных процесса.

WTF процедура процедуры? - опечатался. Просто запускаю процедуру, которая выдает данные по продажам по каждому дню в таблицу
...
Рейтинг: 0 / 0
13.12.2021, 18:47
    #40119716
msLex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в ALTER TABLE
выполните и гляньте что у вас там "напритовалось", часть вопросов отпадет.





Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
DROP TABLE IF EXISTS #tmpBusicasapodnyam1
DECLARE @nowDate datetime = getdate() 
DECLARE @DateRange datetime
DECLARE @startdat datetime = '2021-12-10 00:00:00.000'
DECLARE @i INT = 0
DECLARE @kolDays INT
DECLARE @def VARCHAR(20)
DECLARE @sql_str VARCHAR(MAX)
SET @kolDays = datediff(DAY,@startdat,@nowDate) 
DECLARE @tablDateRange TABLE(DateRange datetime)
while @i < @kolDays
BEGIN    
    INSERT INTO @tablDateRange (DateRange)
    SELECT dateadd(DAY,@i,@startdat)
    SET @i = @i + 1
END;
 
 
CREATE TABLE #tmpBusicasapodnyam1 
    (market_name VARCHAR(255), market_id DOUBLE PRECISION, dep_special DOUBLE PRECISION, bonus_used_brt DOUBLE PRECISION)
    ALTER TABLE #tmpBusicasapodnyam1 ADD datecurra VARCHAR(MAX);
 
DECLARE idx_cursor CURSOR LOCAL FOR SELECT DateRange FROM @tablDateRange;
OPEN idx_cursor;
FETCH NEXT FROM idx_cursor
INTO @DateRange;
WHILE @@fetch_status = 0
BEGIN
    DECLARE @dateEnd datetime = dateadd(HOUR, 23,@DateRange)    
    SET @sql_str = 'alter table #tmpBusicasapodnyam1 add constraint df_datecurra default '  + CAST(@DateRange AS VARCHAR(MAX)) + '  for datecurra'
    print @sql_str
    
    FETCH NEXT FROM idx_cursor
    INTO @DateRange;
END;
CLOSE idx_cursor;
DEALLOCATE idx_cursor;
SELECT *
FROM #tmpBusicasapodnyam1
...
Рейтинг: 0 / 0
13.12.2021, 18:52
    #40119718
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в ALTER TABLE
gerzzog
Мой код здесь:
Вы бы вставили код в свой пост, в спойлере и теге SRC. Неохота лезть на какой то непонятный сайт.
...
Рейтинг: 0 / 0
14.12.2021, 07:57
    #40119815
gerzzog
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в ALTER TABLE
msLex,
запрос проработал и такие сообщения:
(1 row affected)

(1 row affected)

(1 row affected)

(1 row affected)
alter table #tmpBusicasapodnyam1 add constraint df_datecurra default Dec 10 2021 12:00AM for datecurra
alter table #tmpBusicasapodnyam1 add constraint df_datecurra default Dec 11 2021 12:00AM for datecurra
alter table #tmpBusicasapodnyam1 add constraint df_datecurra default Dec 12 2021 12:00AM for datecurra
alter table #tmpBusicasapodnyam1 add constraint df_datecurra default Dec 13 2021 12:00AM for datecurra

(0 rows affected)

Completion time: 2021-12-14T07:56:26.3366993+03:00
...
Рейтинг: 0 / 0
14.12.2021, 07:59
    #40119816
gerzzog
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в ALTER TABLE
alexeyvg
gerzzog
Мой код здесь:
Вы бы вставили код в свой пост, в спойлере и теге SRC. Неохота лезть на какой то непонятный сайт.


Вот полный код здесь выкладываю:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
DROP TABLE IF EXISTS #tmpBusicasapodnyam1
DECLARE @nowDate datetime = getdate() 
DECLARE @DateRange datetime
DECLARE @startdat datetime = '2021-12-10 00:00:00.000'
DECLARE @i INT = 0
DECLARE @kolDays INT
DECLARE @def VARCHAR(20)
DECLARE @sql_str VARCHAR(MAX)
SET @kolDays = datediff(DAY,@startdat,@nowDate) 
DECLARE @tablDateRange TABLE(DateRange datetime)
while @i < @kolDays
BEGIN    
    INSERT INTO @tablDateRange (DateRange)
    SELECT dateadd(DAY,@i,@startdat)
    SET @i = @i + 1
END;
 
 
CREATE TABLE #tmpBusicasapodnyam1 
    (market_name VARCHAR(255), market_id DOUBLE PRECISION, dep_special DOUBLE PRECISION, bonus_used_brt DOUBLE PRECISION)
    ALTER TABLE #tmpBusicasapodnyam1 ADD datecurra VARCHAR(MAX);
 
DECLARE idx_cursor CURSOR LOCAL FOR SELECT DateRange FROM @tablDateRange;
OPEN idx_cursor;
FETCH NEXT FROM idx_cursor
INTO @DateRange;
WHILE @@fetch_status = 0
BEGIN
    DECLARE @dateEnd datetime = dateadd(HOUR, 23,@DateRange)    
    SET @sql_str = 'alter table #tmpBusicasapodnyam1 add constraint df_datecurra default '  + CAST(@DateRange AS VARCHAR(MAX)) + '  for datecurra'
    EXEC(@sql_str)
    INSERT INTO #tmpBusicasapodnyam1 (market_name , market_id , dep_special , bonus_used_brt)
    EXEC get_otchet @pstart_date = @DateRange, @pend_date = @dateEnd
    SET @sql_str = 'ALTER TABLE #tmpBusicasapodnyam1 DROP CONSTRAINT df_datecurra'
    EXEC(@sql_str)
    
    FETCH NEXT FROM idx_cursor
    INTO @DateRange;
END;
CLOSE idx_cursor;
DEALLOCATE idx_cursor;
SELECT *
FROM #tmpBusicasapodnyam1

...
Рейтинг: 0 / 0
14.12.2021, 08:49
    #40119822
gerzzog
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в ALTER TABLE
msLex,
кстати, если я запускаю:
Код: sql
1.
2.
3.
4.
5.
6.
 
DECLARE @dateEnd datetime = dateadd(HOUR, 23,@DateRange)    
    SET @sql_str = 'alter table #tmpBusicasapodnyam1 add constraint df_datecurra default '  + try_convert(VARCHAR(MAX),@DateRange) + '  
    for datecurra'
    print @sql_str
    EXEC(@sql_str)



то пишет ошибку

alter table #tmpBusicasapodnyam1 add constraint df_datecurra default Dec 10 2021 12:00AM for datecurra
Msg 102, Level 15, State 1, Line 1
Incorrect syntax near '10'.
alter table #tmpBusicasapodnyam1 add constraint df_datecurra default Dec 11 2021 12:00AM for datecurra
Msg 102, Level 15, State 1, Line 1
Incorrect syntax near '11'.
alter table #tmpBusicasapodnyam1 add constraint df_datecurra default Dec 12 2021 12:00AM for datecurra
Msg 102, Level 15, State 1, Line 1
Incorrect syntax near '12'.
alter table #tmpBusicasapodnyam1 add constraint df_datecurra default Dec 13 2021 12:00AM for datecurra
Msg 102, Level 15, State 1, Line 1
Incorrect syntax near '13'.

это на даты, которые я из datetime в varchar перевожу
...
Рейтинг: 0 / 0
14.12.2021, 09:07
    #40119824
felix_ff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в ALTER TABLE
gerzzog,

а вас ничего не смущает что строка :
Код: sql
1.
alter table #tmpBusicasapodnyam1 add constraint df_datecurra default Dec 13 2021 12:00AM for datecurra


синтаксически неправильна?

и на "подумать" где там у вас чего не хватает
...
Рейтинг: 0 / 0
14.12.2021, 09:15
    #40119829
gerzzog
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в ALTER TABLE
felix_ff
gerzzog,

а вас ничего не смущает что строка :
Код: sql
1.
alter table #tmpBusicasapodnyam1 add constraint df_datecurra default Dec 13 2021 12:00AM for datecurra


синтаксически неправильна?

и на "подумать" где там у вас чего не хватает

пытаюсь "кавычки" расставить, но что-то не хочет. И скобку возле кавычек. Где правильнее это делать?

вот так делаю:
Код: sql
1.
SET @sql_str = 'alter table #tmpBusicasapodnyam1 add constraint df_datecurra default "'  + cast(@DateRange as VARCHAR(MAX)) + '"  for datecurra'



и ошибка:

alter table #tmpBusicasapodnyam1 add constraint df_datecurra default "Dec 10 2021 12:00AM" for datecurra
Msg 128, Level 15, State 1, Line 1
The name "Dec 10 2021 12:00AM" is not permitted in this context. Valid expressions are constants, constant expressions, and (in some contexts) variables. Column names are not permitted.
alter table #tmpBusicasapodnyam1 add constraint df_datecurra default "Dec 11 2021 12:00AM" for datecurra
Msg 128, Level 15, State 1, Line 1
The name "Dec 11 2021 12:00AM" is not permitted in this context. Valid expressions are constants, constant expressions, and (in some contexts) variables. Column names are not permitted.
alter table #tmpBusicasapodnyam1 add constraint df_datecurra default "Dec 12 2021 12:00AM" for datecurra
Msg 128, Level 15, State 1, Line 1
The name "Dec 12 2021 12:00AM" is not permitted in this context. Valid expressions are constants, constant expressions, and (in some contexts) variables. Column names are not permitted.
alter table #tmpBusicasapodnyam1 add constraint df_datecurra default "Dec 13 2021 12:00AM" for datecurra
Msg 128, Level 15, State 1, Line 1
The name "Dec 13 2021 12:00AM" is not permitted in this context. Valid expressions are constants, constant expressions, and (in some contexts) variables. Column names are not permitted.
...
Рейтинг: 0 / 0
14.12.2021, 09:37
    #40119832
gerzzog
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в ALTER TABLE
Все, готово!
Корректный код:

Код: sql
1.
[SET @sql_str = 'alter table #tmpBusicasapodnyam1 add constraint df_datecurra default '''  + cast(@DateRange as VARCHAR(MAX)) + '''  for datecurra'



Всем большое спасибо за помощь!
...
Рейтинг: 0 / 0
14.12.2021, 12:30
    #40119892
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в ALTER TABLE
gerzzog
Все, готово!
Корректный код:

Код: sql
1.
[SET @sql_str = 'alter table #tmpBusicasapodnyam1 add constraint df_datecurra default '''  + cast(@DateRange as VARCHAR(MAX)) + '''  for datecurra'



Всем большое спасибо за помощь!


Быстро, четко сработал

Это нормально:
Код: sql
1.
cast(@DateRange as VARCHAR(MAX))
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Ошибка в ALTER TABLE / 17 сообщений из 17, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]