Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: 1 2      [все]
 Очень странный глюк 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
Сообщений: 6680
Katrine_S,

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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
Сообщений: 6680
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

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

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

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

Откуда: Москва
Сообщений: 8838
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
Сообщений: 6680
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

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

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

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

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

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

Откуда: Kiev
Сообщений: 6680
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
Какое преимущество у данных манипуляций перед банальным переименованием #t?

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

какие ж тут преимущества, народ клепает временные таблицы чаще всего с одними и теми же именами, при этом
пользуя SELECT ... INTO <любимое имя>и потом пытаясь работать с названиями полей получают ошибку, и начинается представление...
11 июл 19, 16:05    [21925055]     Ответить | Цитировать Сообщить модератору
 Re: Очень странный глюк SQL. Может быть уже кто-то с этим сталкивался  [new]
Katrine_S
Member

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

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

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


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


А почему нельзя просто так:
CREATE OR ALTER PROCEDURE dbo.Test2
AS
    CREATE TABLE #b (a char);
     
    INSERT INTO #b  SELECT  'a'

    SELECT a FROM #b
    
GO
12 июл 19, 08:05    [21925389]     Ответить | Цитировать Сообщить модератору
 Re: Очень странный глюк SQL. Может быть уже кто-то с этим сталкивался  [new]
invm
Member

Откуда: Москва
Сообщений: 8838
Katrine_S
А можно объяснить что не так с данным кодом?
Выполните пример с предложенной модификацией - 21925005

Katrine_S
А почему нельзя просто так
Можно.
А теперь представьте, что столбцов 100500.
Что проще: написать create table на 100500 столбцов или select * into ... from ... ?
12 июл 19, 09:09    [21925420]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2      [все]
Все форумы / Microsoft SQL Server Ответить