Как использовать тип данных (таблица), определенный в другой базе данных в SQL2k8? - PullRequest
6 голосов
/ 20 мая 2010

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

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

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

Ответы [ 4 ]

2 голосов
/ 20 мая 2010

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

0 голосов
/ 06 марта 2013

Когда-то назад для этой темы, но я пытался сделать то же самое и был раздражен тем же ограничением.

Не объявляйте @ table, но используйте таблицу #, которая может быть вызвана изстрока 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
0 голосов
/ 20 мая 2010

вы можете попробовать использовать 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.

0 голосов
/ 20 мая 2010

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

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

См. эту статью о том, как сделать то, что вам нужно

...