Привет всем. Столкнулся с очень интересным поведением MS SQL Server 2008 R2. Началось с того, что создал табличную переменную (User-Defined Table Type) и хотел передать её в табличную переменную (Table-valued Function).
Всё бы ничего, но столкнулся с очень интересным поведением.
Для повторения эксперимента предоставляю вам код типа и функции:
И нtпосредсвенно сам вызов функции:
Вроде бы всё хорошо, результат правильный, но самые странности начинались при повторном вызове этой функции. Связь сразу же прерывалась и выдавала ошибку:
(1 row(s) affected)
Msg 0, Level 11, State 0, Line 0
A severe error occurred on the current command. The results, if any, should be discarded.
Msg 0, Level 20, State 0, Line 0
A severe error occurred on the current command. The results, if any, should be discarded.
Гугл объяснять наотрез отказался, единственное решение, которое мне пришло в голову это метод системного научного тыка. Во первых попробовал убрать первичный ключ в переменной:
Запустил запрос. Как и раньше, с первого раза он выдавал ожидаемый результат, но все последующие разы он не возвращал ничего. Что самое интересное, то если я пересоздавал функцию, в первый раз она срабатывала…
Пробовал менять много всего, типы данных, базу, имена пока наконец-то не отыскал в чём была причина. Интереса ради прячу ответ, может кто сможет сам догадаться?
А причина была в том, что имя возвращаемой таблички в функции совпадало с именем переменной в запросе, т.е. и там и там использовалось имя @TPs
Всё бы ничего, но столкнулся с очень интересным поведением.
Для повторения эксперимента предоставляю вам код типа и функции:
CREATE TYPE [dbo].[TestTVP] AS TABLE(
[a] [INT] NOT NULL,
PRIMARY KEY CLUSTERED
(
[a] ASC
)WITH (IGNORE_DUP_KEY = OFF)
)
GO
CREATE FUNCTION [dbo].[Fn_Test](@t TestTVP READONLY)
RETURNS @Tps TABLE(t INT )
AS
BEGIN
INSERT INTO @Tps
SELECT 1 FROM @t
RETURN;
END
GO
И нtпосредсвенно сам вызов функции:
DECLARE @TPs TestTVP
INSERT INTO @TPs VALUES (1)
SELECT * FROM [dbo].[Fn_Test](@TPs)
--Результат: 1
Вроде бы всё хорошо, результат правильный, но самые странности начинались при повторном вызове этой функции. Связь сразу же прерывалась и выдавала ошибку:
(1 row(s) affected)
Msg 0, Level 11, State 0, Line 0
A severe error occurred on the current command. The results, if any, should be discarded.
Msg 0, Level 20, State 0, Line 0
A severe error occurred on the current command. The results, if any, should be discarded.
Гугл объяснять наотрез отказался, единственное решение, которое мне пришло в голову это метод системного научного тыка. Во первых попробовал убрать первичный ключ в переменной:
CREATE TYPE [dbo].[TestTVP] AS TABLE(
[a] [INT] NOT NULL
)
GO
Запустил запрос. Как и раньше, с первого раза он выдавал ожидаемый результат, но все последующие разы он не возвращал ничего. Что самое интересное, то если я пересоздавал функцию, в первый раз она срабатывала…
Пробовал менять много всего, типы данных, базу, имена пока наконец-то не отыскал в чём была причина. Интереса ради прячу ответ, может кто сможет сам догадаться?
А причина была в том, что имя возвращаемой таблички в функции совпадало с именем переменной в запросе, т.е. и там и там использовалось имя @TPs