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