Как использовать тип данных (таблица), определенный в другой базе данных в SQL2K8?
-
03-10-2019 - |
Вопрос
У меня есть тип таблицы, определенный в базе данных. Используется в качестве табличного параметра в хранимой процедуре. Я хотел бы вызвать эту процедуру из другой базы данных, и для того, чтобы пройти параметр, мне нужно ссылаться на этот определенный тип.
Но, когда я делаю 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