Операционный столбец типа таблицы sql server
У меня один и тот же тип таблицы, определенный в двух разных схемах базы данных. Когда я пытаюсь вызвать SP из одной схемы в другую, передав тип как параметр, я получил следующую ошибку:
"Столкновение типа операнда myCustomType несовместимо с myCustomType"
У меня есть следующий код:
Определение типа
CREATE TYPE myCustomType AS TABLE
(
somevalue INT,
somevalue2 INT
);
Определение хранимой процедуры
USE DB1
GO
CREATE PROC1(
@myVar myCustomType READONLY
)
AS
BEGIN
EXEC db2.dbo.PROC2 @myVar
END
GO
USE DB2
GO
CREATE PROC2(
@myVar myCustomType READONLY
)
AS
BEGIN
--do something with myVar
END
Выполнение
USE db1
GO
DECLARE @myVar myCustomType
INSERT into @myVar(1,2)
EXEC PROC1 @myVar
Как я могу исправить эту проблему?
Ответы
Ответ 1
Вы сталкиваетесь с одним из ограничений типа таблицы, определенной пользователем.
Смотрите элемент Microsoft Connect, закрытый как "как запроектированный".
Приведенное рассуждение состоит в том, что
- Тип [table] параметра proc должен быть точно таким же типом входящего параметра
- Становится все дороже проверять правильность применения правила (1)
Невозможно передать параметры табличного типа между базами данных, потому что вы не можете использовать код типа
create proc PROC2(
@myVar db1.dbo.myCustomType READONLY
)
Ошибка:
Имя типа 'db1.dbo.myCustomType' содержит больше, чем максимальное количество префиксов. Максимум равен 1.
Просто потому, что вы назвали их одинаковыми и дали им одинаковое определение как в DB1, так и в DB2, не делают их одного и того же типа - они остаются несовместимыми, так же как и нижеследующее, которое также терпит неудачу на одном db:
CREATE TYPE myCustomTypeX AS TABLE
(
somevalue INT,
somevalue2 INT
);
GO
create proc procX
@in myCustomTypeX readonly
AS
select * from @in myCustomTypeX;
GO
declare @myCustomTypeX TABLE
(
somevalue INT,
somevalue2 INT
);
exec procX @myCustomTypeX
--
Msg 206, Level 16, State 2, Procedure procX, Line 0
Operand type clash: table is incompatible with myCustomTypeX
Ответ 2
Я использую SQL Server 2012 для обеих баз данных, и это ограничение по-прежнему применяется.
Там отличная статья, полная обходных решений:
http://www.sommarskog.se/share_data.html
Для моей непосредственной проблемы я пошел с XML, чтобы передать таблицу данных из одного proc в другой. Это неуклюже, но мне нужно пройти всего пару десятков записей за раз. Это намного больше, и я начну беспокоиться о производительности.
Ответ 3
Единственный способ, которым это будет работать, - это определенный пользователем CLR-тип, и он также имеет свои ограничения:
https://technet.microsoft.com/en-us/library/ms178069%28v=sql.105%29.aspx