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?

È stato utile?

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top