Как стать автором
Обновить

Странный баг в Microsoft SQL Server 2008 R2

Привет всем. Столкнулся с очень интересным поведением MS SQL Server 2008 R2. Началось с того, что создал табличную переменную (User-Defined Table Type) и хотел передать её в табличную переменную (Table-valued Function).
Всё бы ничего, но столкнулся с очень интересным поведением.

Для повторения эксперимента предоставляю вам код типа и функции:

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
Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.