Как использовать тип данных (таблица), определенный в другой базе данных в SQL2K8?

StackOverflow https://stackoverflow.com/questions/2876819

Вопрос

У меня есть тип таблицы, определенный в базе данных. Используется в качестве табличного параметра в хранимой процедуре. Я хотел бы вызвать эту процедуру из другой базы данных, и для того, чтобы пройти параметр, мне нужно ссылаться на этот определенный тип.

Но, когда я делаю DECLARE @table dbOtherDatabase.dbo.TypeName это говорит мне, что The type name 'dbOtherDatabase.dbo.TypeName' contains more than the maximum number of prefixes. The maximum is 1.

Как я могу ссылаться на этот тип таблицы?

Это было полезно?

Решение

Пользовательские типы кросс-базы данных, по-видимому, работают только для типов на основе CLR. Видеть Этот форум а также MSDN (плюс комментарии).

Другие советы

Вы можете попробовать использовать SP_EXECUTESQL:

DECLARE @mylist integer_list_tbltype,
        @sql nvarchar(MAX)
SELECT  @sql = N'SELECT p.ProductID, p.ProductName
                 FROM    Northwind..Products p
                 WHERE   p.ProductID IN (SELECT n FROM @prodids)'
INSERT @mylist VALUES(9),(12),(27),(37)
EXEC sp_executesql @sql, N'@prodids integer_list_tbltype READONLY', @mylist

И если это не работает, вам, возможно, придется создать процедуру обертки в удаленной БД, где вы проходите в строке CSV, и процедура обертки расщепляется и создает таблицу (теперь используя тип локальной таблицы), чтобы перейти в фактическая процедура. Видеть Этот ответ Для объяснения о том, как разделить строку CVS.

Можете ли вы не просто определить тип в обоих базах данных.

Редактировать

Видеть это Статья о том, как делать то, что вам нужно

В то время как назад за эту нить, но я пытался сделать то же самое и было раздражено тем же ограничением.

Не объявляйте таблицу @, но используйте # таблицу, которая может быть вызвана из строки EXEC, где база данных может быть переключена на один с типом таблицы.

например

use dbA
create type ThisTableRecord as table (id int, value varchar(max))

go

create procedure ThisTableSave
    @ThisTable ThisTableRecord readonly
AS
begin
    select * from @thisTable
end

go

use dbB

go

create procedure ThatTableSave

as begin

   create table #thatTable (id int, value varchar(max))

   insert into #thatTable
   values   (1, 'killing')
        ,   (2, 'joke')
        ,   (3, 'the')
        ,   (4, 'damned')

   exec ('
use dbA
declare @thisTable thisTableRecord
insert into @thisTable select * from #thatTable
exec thisTableSave @thisTable
')

end

exec ThatTableSave
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top