Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Очень странный глюк SQL. Может быть уже кто-то с этим сталкивался  [new]
Katrine_S
Member

Откуда:
Сообщений: 12
Добрый день.

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

У меня есть 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, без этого процедура упорно вылетает по ошибке.

Может быть кто-нибудь уже сталкивался с подобной ошибкой?
11 июл 19, 09:16    [21924525]     Ответить | Цитировать Сообщить модератору
 Re: Очень странный глюк SQL. Может быть уже кто-то с этим сталкивался  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6378
Katrine_S,

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

SELECT из представления?
Ошбика разве вам не говорит где конкретно не совпадение?
больше фактов...
11 июл 19, 09:30    [21924537]     Ответить | Цитировать Сообщить модератору
 Re: Очень странный глюк SQL. Может быть уже кто-то с этим сталкивался  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6378
ну и несовпадение не даст скомпилировать если такой объёкт есть. Т.е. ваши out вы создаёте в p_out а потом в p_calc из них берёте? объекты статические?
11 июл 19, 09:32    [21924541]     Ответить | Цитировать Сообщить модератору
 Re: Очень странный глюк SQL. Может быть уже кто-то с этим сталкивался  [new]
court
Member

Откуда:
Сообщений: 1740
Katrine_S
имя столбца или число предоставленных значений не соответствует определению таблицы


такая ошибка бывает когда в обоих ХП есть создается 2-е таблицы с одним и тем же именем
11 июл 19, 09:37    [21924546]     Ответить | Цитировать Сообщить модератору
 Re: Очень странный глюк SQL. Может быть уже кто-то с этим сталкивался  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 28737
Katrine_S
На текущий момент решила проблему вылетания Jobа, путем запуска процедуры p_calc с пустыми параметрами перед запуском p_out, без этого процедура упорно вылетает по ошибке.
Попробуйте кеши планов почистить.
11 июл 19, 09:38    [21924548]     Ответить | Цитировать Сообщить модератору
 Re: Очень странный глюк SQL. Может быть уже кто-то с этим сталкивался  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 28737
court
Katrine_S
имя столбца или число предоставленных значений не соответствует определению таблицы


такая ошибка бывает когда в обоих ХП есть создается 2-е таблицы с одним и тем же именем
Ага, похоже.
Вообще, такие ошибки нужно лечить просмотром того стейтмента, на котором произошла ошибка, и поискам во всех процедурах имён таблиц и процедур, которые встречаются в этом стейтменте (ну и анализ мест, где они встретились).
11 июл 19, 09:47    [21924566]     Ответить | Цитировать Сообщить модератору
 Re: Очень странный глюк SQL. Может быть уже кто-то с этим сталкивался  [new]
Katrine_S
Member

Откуда:
Сообщений: 12
court
Katrine_S
имя столбца или число предоставленных значений не соответствует определению таблицы


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


Спасибо. Помогло.
В обеих процедурах создавалась виртуальная таблица с одним и тем же именем для фильтрации данных.
После изменений они стали отличаться. После внесения соответствующих изменений в p_calc все заработало.
11 июл 19, 11:23    [21924676]     Ответить | Цитировать Сообщить модератору
 Re: Очень странный глюк SQL. Может быть уже кто-то с этим сталкивался  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 6536
Katrine_S,

Временные таблицы с одинаковыми именами должны иметь одинаковую структуру. См. справку по временным таблицам.
11 июл 19, 14:15    [21924923]     Ответить | Цитировать Сообщить модератору
 Re: Очень странный глюк SQL. Может быть уже кто-то с этим сталкивался  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6378
Владислав Колосов
Katrine_S,

Временные таблицы с одинаковыми именами должны иметь одинаковую структуру. См. справку по временным таблицам.

кому должны? Никто не запрещает
11 июл 19, 14:25    [21924935]     Ответить | Цитировать Сообщить модератору
 Re: Очень странный глюк SQL. Может быть уже кто-то с этим сталкивался  [new]
uaggster
Member

Откуда:
Сообщений: 620
Владислав Колосов
Katrine_S,

Временные таблицы с одинаковыми именами должны иметь одинаковую структуру. См. справку по временным таблицам.

WTF???
Вы, случайно, не путаете с требованиями по снижением затрат по многократному высокочастотному созданию временных таблиц?
11 июл 19, 14:55    [21924968]     Ответить | Цитировать Сообщить модератору
 Re: Очень странный глюк SQL. Может быть уже кто-то с этим сталкивался  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6378
uaggster
Владислав Колосов
Katrine_S,

Временные таблицы с одинаковыми именами должны иметь одинаковую структуру. См. справку по временным таблицам.

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

и эти требования тоже огласите, раздел с одинаковыми структурами снижающими ото остальное
11 июл 19, 15:04    [21924983]     Ответить | Цитировать Сообщить модератору
 Re: Очень странный глюк SQL. Может быть уже кто-то с этим сталкивался  [new]
msLex
Member

Откуда:
Сообщений: 6279
uaggster
Владислав Колосов
Katrine_S,

Временные таблицы с одинаковыми именами должны иметь одинаковую структуру. См. справку по временным таблицам.

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


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

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

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



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


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

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



create proc p2 
as
	create #t (id1 int)
	...
go
11 июл 19, 15:07    [21924984]     Ответить | Цитировать Сообщить модератору
 Re: Очень странный глюк SQL. Может быть уже кто-то с этим сталкивался  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6378
msLex,

Я вот не говорю что делайте, но где же эти рекомендации?
11 июл 19, 15:13    [21924992]     Ответить | Цитировать Сообщить модератору
 Re: Очень странный глюк SQL. Может быть уже кто-то с этим сталкивался  [new]
msLex
Member

Откуда:
Сообщений: 6279
TaPaK
msLex,

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


В доке

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.
11 июл 19, 15:16    [21924994]     Ответить | Цитировать Сообщить модератору
 Re: Очень странный глюк SQL. Может быть уже кто-то с этим сталкивался  [new]
msLex
Member

Откуда:
Сообщений: 6279
Ну и простенький пример, с ошибкой, вызванной повторной компиляцией вложенной процедуры в момент ее вызова из внешней


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'.
11 июл 19, 15:27    [21925004]     Ответить | Цитировать Сообщить модератору
 Re: Очень странный глюк SQL. Может быть уже кто-то с этим сталкивался  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6378
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
11 июл 19, 15:27    [21925005]     Ответить | Цитировать Сообщить модератору
 Re: Очень странный глюк SQL. Может быть уже кто-то с этим сталкивался  [new]
msLex
Member

Откуда:
Сообщений: 6279
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


Важен момент компиляции вложенной процедуры. И это самое плохое, получается "плавающая" ошибка, отловить которую очень трудно.
11 июл 19, 15:29    [21925008]     Ответить | Цитировать Сообщить модератору
 Re: Очень странный глюк SQL. Может быть уже кто-то с этим сталкивался  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6378
msLex,

автор
. И это самое плохое, получается "плавающая" ошибка, отловить которую очень трудно.

о да, есть знакомые извращенцы с такими подходами :)
11 июл 19, 15:30    [21925012]     Ответить | Цитировать Сообщить модератору
 Re: Очень странный глюк SQL. Может быть уже кто-то с этим сталкивался  [new]
invm
Member

Откуда: Москва
Сообщений: 8664
TaPaK,

А если так:
CREATE OR ALTER PROCEDURE dbo.Test2
AS
SELECT 'aaa' as a INTO #t
SELECT a FROM #t
GO
11 июл 19, 15:32    [21925015]     Ответить | Цитировать Сообщить модератору
 Re: Очень странный глюк SQL. Может быть уже кто-то с этим сталкивался  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6378
invm
TaPaK,

А если так:
CREATE OR ALTER PROCEDURE dbo.Test2
AS
SELECT 'aaa' as a INTO #t
SELECT a FROM #t
GO

а так не будем
11 июл 19, 15:34    [21925017]     Ответить | Цитировать Сообщить модератору
 Re: Очень странный глюк SQL. Может быть уже кто-то с этим сталкивался  [new]
invm
Member

Откуда: Москва
Сообщений: 8664
TaPaK
а так не будем
А если таки надо?
11 июл 19, 15:40    [21925023]     Ответить | Цитировать Сообщить модератору
 Re: Очень странный глюк SQL. Может быть уже кто-то с этим сталкивался  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6378
invm
TaPaK
а так не будем
А если таки надо?



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
11 июл 19, 15:45    [21925030]     Ответить | Цитировать Сообщить модератору
 Re: Очень странный глюк SQL. Может быть уже кто-то с этим сталкивался  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6378
или

    EXEC ('SELECT a FROM #t')
11 июл 19, 15:48    [21925034]     Ответить | Цитировать Сообщить модератору
 Re: Очень странный глюк SQL. Может быть уже кто-то с этим сталкивался  [new]
msLex
Member

Откуда:
Сообщений: 6279
TaPaK
invm
пропущено...
А если таки надо?



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


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

По мне, так такое кривое поведение с # таблицами - документированная бага.
Ведь нет ничего проще найти стейтмент с созданием # таблицы внутри модуля и использовать его. Создание # таблицы не спрячешь в динамике или вложенном стейтменте, они как на ладони.
11 июл 19, 15:50    [21925036]     Ответить | Цитировать Сообщить модератору
 Re: Очень странный глюк SQL. Может быть уже кто-то с этим сталкивался  [new]
invm
Member

Откуда: Москва
Сообщений: 8664
TaPaK
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
11 июл 19, 15:58    [21925048]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить