Come utilizzare un tipo di dati (tabella) definito in un altro database in SQL2k8?
-
03-10-2019 - |
Domanda
Ho un tipo di tabella definito in un database. E 'usato come parametro con valori di tabella in una stored procedure. Vorrei chiamare questa procedura da un altro database, e per passare il parametro, ho bisogno di fare riferimento a questo tipo definito.
Ma quando faccio DECLARE @table dbOtherDatabase.dbo.TypeName
, mi dice che The type name 'dbOtherDatabase.dbo.TypeName' contains more than the maximum number of prefixes. The maximum is 1.
Come potrei fare riferimento a questo tipo di tabella?
Soluzione
tra database tipi definiti dall'utente sembra funzionare solo per i tipi CLR-based. Vedere questo forum e MSDN (più commenti).
Altri suggerimenti
si potrebbe provare a utilizzare 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
e se questo non dovesse funzionare potrebbe essere necessario creare una procedura involucro nel DB a distanza, in cui si passa in una stringa CSV e la procedura involucro divide e crea la tabella (ora utilizzando il tipo di tabella locale) per poi passare nella procedura reale. Vedere questa risposta per una spiegazione su come dividere una stringa CVS.
Si può non solo definire il tipo in entrambi i database.
Modifica
questo articolo su come fare ciò che si richiede
Mentre fa di questa discussione, ma stavo cercando di fare la stessa cosa e sono rimasto infastidito dalla stessa restrizione.
Non dichiarare una tabella @ ma utilizzare un tavolo # che può essere chiamato dalla stringa exec in cui il database può essere commutata a quello con tipo di tabella.
per es.
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