Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Очень странный глюк SQL. Может быть уже кто-то с этим сталкивался / 25 сообщений из 28, страница 1 из 2
11.07.2019, 09:16
    #39836168
Katrine_S
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очень странный глюк SQL. Может быть уже кто-то с этим сталкивался
Добрый день.

Вчера столкнулась с очень странной проблемой.

У меня есть Job, который запускает процедуру p_out. Внутри p_out запускается процедура p_calc.
Процедура p_calc пишет данные в tbl_calc. Далее p_out пишет данные в несколько табличек out.
Процедура p_calc ссылается на таблички out только в паре мест путем SELECT конкретно указанных полей.

Я изменила структуру таблиц out, добавив в них дополнительную колонку и поменяла процедуру p_out.

При попытке запуска Job вылетел со следующей ошибкой:
имя столбца или число предоставленных значений не соответствует определению таблицы

Казалось бы все просто, где-то в процедуре p_out, забыла что-то подправить, но тут началось самое интересно.

При попытке запуска процедуры p_out в ManagementStudio выяснилось, что данная ошибка выскакивает именно при запуске процедуры p_calc внутри p_out.
Далее попробовала запустить отдельно p_calc и она, о чудо, отработала без ошибок (как и должна была, т.к. изменения ее не касались вообще).
Но самое странное произошло дальше. При повторном запуске p_out все отработало без проблем.

На текущий момент решила проблему вылетания Jobа, путем запуска процедуры p_calc с пустыми параметрами перед запуском p_out, без этого процедура упорно вылетает по ошибке.

Может быть кто-нибудь уже сталкивался с подобной ошибкой?
...
Рейтинг: 0 / 0
11.07.2019, 09:30
    #39836173
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очень странный глюк SQL. Может быть уже кто-то с этим сталкивался
Katrine_S,

пересказ впечатляет,
... а утка в зайце, заяц в яйце.

SELECT из представления?
Ошбика разве вам не говорит где конкретно не совпадение?
больше фактов...
...
Рейтинг: 0 / 0
11.07.2019, 09:32
    #39836174
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очень странный глюк SQL. Может быть уже кто-то с этим сталкивался
ну и несовпадение не даст скомпилировать если такой объёкт есть. Т.е. ваши out вы создаёте в p_out а потом в p_calc из них берёте? объекты статические?
...
Рейтинг: 0 / 0
11.07.2019, 09:37
    #39836177
court
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очень странный глюк SQL. Может быть уже кто-то с этим сталкивался
Katrine_Sимя столбца или число предоставленных значений не соответствует определению таблицы

такая ошибка бывает когда в обоих ХП есть создается 2-е таблицы с одним и тем же именем
...
Рейтинг: 0 / 0
11.07.2019, 09:38
    #39836179
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очень странный глюк SQL. Может быть уже кто-то с этим сталкивался
Katrine_SНа текущий момент решила проблему вылетания Jobа, путем запуска процедуры p_calc с пустыми параметрами перед запуском p_out, без этого процедура упорно вылетает по ошибке.Попробуйте кеши планов почистить.
...
Рейтинг: 0 / 0
11.07.2019, 09:47
    #39836185
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очень странный глюк SQL. Может быть уже кто-то с этим сталкивался
courtKatrine_Sимя столбца или число предоставленных значений не соответствует определению таблицы

такая ошибка бывает когда в обоих ХП есть создается 2-е таблицы с одним и тем же именемАга, похоже.
Вообще, такие ошибки нужно лечить просмотром того стейтмента, на котором произошла ошибка, и поискам во всех процедурах имён таблиц и процедур, которые встречаются в этом стейтменте (ну и анализ мест, где они встретились).
...
Рейтинг: 0 / 0
11.07.2019, 11:23
    #39836243
Katrine_S
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очень странный глюк SQL. Может быть уже кто-то с этим сталкивался
courtKatrine_Sимя столбца или число предоставленных значений не соответствует определению таблицы

такая ошибка бывает когда в обоих ХП есть создается 2-е таблицы с одним и тем же именем

Спасибо. Помогло.
В обеих процедурах создавалась виртуальная таблица с одним и тем же именем для фильтрации данных.
После изменений они стали отличаться. После внесения соответствующих изменений в p_calc все заработало.
...
Рейтинг: 0 / 0
11.07.2019, 14:15
    #39836383
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очень странный глюк SQL. Может быть уже кто-то с этим сталкивался
Katrine_S,

Временные таблицы с одинаковыми именами должны иметь одинаковую структуру. См. справку по временным таблицам.
...
Рейтинг: 0 / 0
11.07.2019, 14:25
    #39836392
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очень странный глюк SQL. Может быть уже кто-то с этим сталкивался
Владислав КолосовKatrine_S,

Временные таблицы с одинаковыми именами должны иметь одинаковую структуру. См. справку по временным таблицам.
кому должны? Никто не запрещает
...
Рейтинг: 0 / 0
11.07.2019, 14:55
    #39836407
uaggster
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очень странный глюк SQL. Может быть уже кто-то с этим сталкивался
Владислав КолосовKatrine_S,

Временные таблицы с одинаковыми именами должны иметь одинаковую структуру. См. справку по временным таблицам.
WTF???
Вы, случайно, не путаете с требованиями по снижением затрат по многократному высокочастотному созданию временных таблиц?
...
Рейтинг: 0 / 0
11.07.2019, 15:04
    #39836415
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очень странный глюк SQL. Может быть уже кто-то с этим сталкивался
uaggsterВладислав КолосовKatrine_S,

Временные таблицы с одинаковыми именами должны иметь одинаковую структуру. См. справку по временным таблицам.
WTF???
Вы, случайно, не путаете с требованиями по снижением затрат по многократному высокочастотному созданию временных таблиц?
и эти требования тоже огласите, раздел с одинаковыми структурами снижающими ото остальное
...
Рейтинг: 0 / 0
11.07.2019, 15:07
    #39836416
msLex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очень странный глюк SQL. Может быть уже кто-то с этим сталкивался
uaggsterВладислав КолосовKatrine_S,

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

Если разные временные таблиц с одним именем используются во вложенных модулях, то, MS очень рекомендует иметь одинаковую структуру данных у этих таблиц

т. е. вот так правильно

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
create proc p1 
as
	create #t (id int)
	exec p2
	...
go



create proc p2 
as
	create #t (id int)
	...
go



а вот так неправильно

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
create proc p1 
as
	create #t (id int)
	exec p2
	...
go



create proc p2 
as
	create #t (id1 int)
	...
go
...
Рейтинг: 0 / 0
11.07.2019, 15:13
    #39836419
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очень странный глюк SQL. Может быть уже кто-то с этим сталкивался
msLex,

Я вот не говорю что делайте, но где же эти рекомендации?
...
Рейтинг: 0 / 0
11.07.2019, 15:16
    #39836420
msLex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очень странный глюк SQL. Может быть уже кто-то с этим сталкивался
TaPaKmsLex,

Я вот не говорю что делайте, но где же эти рекомендации?

В доке

https://docs.microsoft.com/ru-ru/sql/t-sql/statements/create-table-transact-sql?view=sql-server-2017


However, for modifications to resolve to the table that was created in the nested procedure, the table must have the same structure, with the same column names, as the table created in the calling procedure. This is shown in the following example.
...
Рейтинг: 0 / 0
11.07.2019, 15:27
    #39836426
msLex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очень странный глюк SQL. Может быть уже кто-то с этим сталкивался
Ну и простенький пример, с ошибкой, вызванной повторной компиляцией вложенной процедуры в момент ее вызова из внешней


Код: 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.
if object_id ('dbo.p1') is not null
	drop proc dbo.p1 
go

if object_id ('dbo.p2') is not null
	drop proc dbo.p2 
go
create proc p1 
as
	create table #t (id int)
	select id 
	from #t

	exec dbo.p2
go

create proc dbo.p2 
as
	create table #t (id1 int)
	select id1
	from #t 
go
/*просто вызов dbo.p2 отрабатывает*/
exec dbo.p2
go
DBCC FREEPROCCACHE
go
/*а вызов из dbo.p1 с компиляцей при существующей #t с другой структурой - нет*/
exec dbo.p1
go
if object_id ('dbo.p1') is not null
	drop proc p1 
go

if object_id ('dbo.p1') is not null
	drop proc p2 
go




Msg 207, Level 16, State 1, Procedure p2, Line 5 [Batch Start Line 24]
Invalid column name 'id1'.
...
Рейтинг: 0 / 0
11.07.2019, 15:27
    #39836427
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очень странный глюк SQL. Может быть уже кто-то с этим сталкивался
msLex,
да ладно
авторDROP TABLE IF EXISTS #t
GO

CREATE OR ALTER PROCEDURE dbo.Test2
AS
SELECT 'aaa' as a INTO #t
SELECT * FROM #t
GO

CREATE OR ALTER PROCEDURE dbo.Test1
AS
CREATE TABLE #t(x INT PRIMARY KEY);
INSERT INTO #t VALUES (1);

SELECT Test1Col = x FROM #t;
EXEC Test2;
GO


CREATE TABLE #t(x INT PRIMARY KEY);
INSERT INTO #t VALUES (99);
GO

EXEC Test1;

SELECT * FROM #t
GO
...
Рейтинг: 0 / 0
11.07.2019, 15:29
    #39836430
msLex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очень странный глюк SQL. Может быть уже кто-то с этим сталкивался
TaPaKmsLex,
да ладно
авторDROP TABLE IF EXISTS #t
GO

CREATE OR ALTER PROCEDURE dbo.Test2
AS
SELECT 'aaa' as a INTO #t
SELECT * FROM #t
GO

CREATE OR ALTER PROCEDURE dbo.Test1
AS
CREATE TABLE #t(x INT PRIMARY KEY);
INSERT INTO #t VALUES (1);

SELECT Test1Col = x FROM #t;
EXEC Test2;
GO


CREATE TABLE #t(x INT PRIMARY KEY);
INSERT INTO #t VALUES (99);
GO

EXEC Test1;

SELECT * FROM #t
GO

Важен момент компиляции вложенной процедуры. И это самое плохое, получается "плавающая" ошибка, отловить которую очень трудно.
...
Рейтинг: 0 / 0
11.07.2019, 15:30
    #39836434
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очень странный глюк SQL. Может быть уже кто-то с этим сталкивался
msLex,

автор. И это самое плохое, получается "плавающая" ошибка, отловить которую очень трудно.
о да, есть знакомые извращенцы с такими подходами :)
...
Рейтинг: 0 / 0
11.07.2019, 15:32
    #39836436
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очень странный глюк SQL. Может быть уже кто-то с этим сталкивался
TaPaK,

А если так:
Код: sql
1.
2.
3.
4.
5.
CREATE OR ALTER PROCEDURE dbo.Test2
AS
SELECT 'aaa' as a INTO #t
SELECT a FROM #t
GO
...
Рейтинг: 0 / 0
11.07.2019, 15:34
    #39836438
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очень странный глюк SQL. Может быть уже кто-то с этим сталкивался
invmTaPaK,

А если так:
Код: sql
1.
2.
3.
4.
5.
CREATE OR ALTER PROCEDURE dbo.Test2
AS
SELECT 'aaa' as a INTO #t
SELECT a FROM #t
GO


а так не будем
...
Рейтинг: 0 / 0
11.07.2019, 15:40
    #39836442
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очень странный глюк SQL. Может быть уже кто-то с этим сталкивался
TaPaKа так не будемА если таки надо?
...
Рейтинг: 0 / 0
11.07.2019, 15:45
    #39836446
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очень странный глюк SQL. Может быть уже кто-то с этим сталкивался
invmTaPaKа так не будемА если таки надо?


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
CREATE OR ALTER PROCEDURE dbo.Test2
AS
    CREATE TABLE #b (a char);
    SELECT  'a' as a INTO #t
    
    INSERT INTO #b SELECT * FROM #t

    SELECT a FROM #b
    
GO
...
Рейтинг: 0 / 0
11.07.2019, 15:48
    #39836448
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очень странный глюк SQL. Может быть уже кто-то с этим сталкивался
или

Код: sql
1.
    EXEC ('SELECT a FROM #t')
...
Рейтинг: 0 / 0
11.07.2019, 15:50
    #39836450
msLex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очень странный глюк SQL. Может быть уже кто-то с этим сталкивался
TaPaKinvmпропущено...
А если таки надо?


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
CREATE OR ALTER PROCEDURE dbo.Test2
AS
    CREATE TABLE #b (a char);
    SELECT  'a' as a INTO #t
    
    INSERT INTO #b SELECT * FROM #t

    SELECT a FROM #b
    
GO



Все это похоже на жуткие костыли.

По мне, так такое кривое поведение с # таблицами - документированная бага.
Ведь нет ничего проще найти стейтмент с созданием # таблицы внутри модуля и использовать его. Создание # таблицы не спрячешь в динамике или вложенном стейтменте, они как на ладони.
...
Рейтинг: 0 / 0
11.07.2019, 15:58
    #39836457
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очень странный глюк SQL. Может быть уже кто-то с этим сталкивался
TaPaK
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
CREATE OR ALTER PROCEDURE dbo.Test2
AS
    CREATE TABLE #b (a char);
    SELECT  'a' as a INTO #t
    
    INSERT INTO #b SELECT * FROM #t

    SELECT a FROM #b
    
GO

Какое преимущество у данных манипуляций перед банальным переименованием #t?

msLexВсе это похоже на жуткие костыли.+100500
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Очень странный глюк SQL. Может быть уже кто-то с этим сталкивался / 25 сообщений из 28, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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