powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Очень странный глюк SQL. Может быть уже кто-то с этим сталкивался
28 сообщений из 28, показаны все 2 страниц
Очень странный глюк SQL. Может быть уже кто-то с этим сталкивался
    #39836168
Katrine_S
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.

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

У меня есть 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
Очень странный глюк SQL. Может быть уже кто-то с этим сталкивался
    #39836173
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Katrine_S,

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

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

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

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

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

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

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

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

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

Временные таблицы с одинаковыми именами должны иметь одинаковую структуру. См. справку по временным таблицам.
WTF???
Вы, случайно, не путаете с требованиями по снижением затрат по многократному высокочастотному созданию временных таблиц?
и эти требования тоже огласите, раздел с одинаковыми структурами снижающими ото остальное
...
Рейтинг: 0 / 0
Очень странный глюк SQL. Может быть уже кто-то с этим сталкивался
    #39836416
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Очень странный глюк SQL. Может быть уже кто-то с этим сталкивался
    #39836419
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
msLex,

Я вот не говорю что делайте, но где же эти рекомендации?
...
Рейтинг: 0 / 0
Очень странный глюк SQL. Может быть уже кто-то с этим сталкивался
    #39836420
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Очень странный глюк SQL. Может быть уже кто-то с этим сталкивался
    #39836426
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и простенький пример, с ошибкой, вызванной повторной компиляцией вложенной процедуры в момент ее вызова из внешней


Код: 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
Очень странный глюк SQL. Может быть уже кто-то с этим сталкивался
    #39836427
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Очень странный глюк SQL. Может быть уже кто-то с этим сталкивался
    #39836430
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Очень странный глюк SQL. Может быть уже кто-то с этим сталкивался
    #39836434
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
msLex,

автор. И это самое плохое, получается "плавающая" ошибка, отловить которую очень трудно.
о да, есть знакомые извращенцы с такими подходами :)
...
Рейтинг: 0 / 0
Очень странный глюк SQL. Может быть уже кто-то с этим сталкивался
    #39836436
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Очень странный глюк SQL. Может быть уже кто-то с этим сталкивался
    #39836438
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Очень странный глюк SQL. Может быть уже кто-то с этим сталкивался
    #39836442
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaKа так не будемА если таки надо?
...
Рейтинг: 0 / 0
Очень странный глюк SQL. Может быть уже кто-то с этим сталкивался
    #39836446
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Очень странный глюк SQL. Может быть уже кто-то с этим сталкивался
    #39836448
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
или

Код: sql
1.
    EXEC ('SELECT a FROM #t')
...
Рейтинг: 0 / 0
Очень странный глюк SQL. Может быть уже кто-то с этим сталкивался
    #39836450
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Очень странный глюк SQL. Может быть уже кто-то с этим сталкивался
    #39836457
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Очень странный глюк SQL. Может быть уже кто-то с этим сталкивался
    #39836460
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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

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

msLexВсе это похоже на жуткие костыли.+100500
какие ж тут преимущества, народ клепает временные таблицы чаще всего с одними и теми же именами, при этом
пользуя SELECT ... INTO <любимое имя>и потом пытаясь работать с названиями полей получают ошибку, и начинается представление...
...
Рейтинг: 0 / 0
Очень странный глюк SQL. Может быть уже кто-то с этим сталкивался
    #39836643
Katrine_S
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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


А можно объяснить что не так с данным кодом? Никогда не создавала временные таблицы данным способом, но недавно в чужом коде увидела нечто подобное.


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



А почему нельзя просто так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
CREATE OR ALTER PROCEDURE dbo.Test2
AS
    CREATE TABLE #b (a char);
     
    INSERT INTO #b  SELECT  'a'

    SELECT a FROM #b
    
GO
...
Рейтинг: 0 / 0
Очень странный глюк SQL. Может быть уже кто-то с этим сталкивался
    #39836655
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Katrine_SА можно объяснить что не так с данным кодом?Выполните пример с предложенной модификацией - 21925005

Katrine_SА почему нельзя просто такМожно.
А теперь представьте, что столбцов 100500.
Что проще: написать create table на 100500 столбцов или select * into ... from ... ?
...
Рейтинг: 0 / 0
28 сообщений из 28, показаны все 2 страниц
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Очень странный глюк SQL. Может быть уже кто-то с этим сталкивался
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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