Comment utiliser un type de données (tableau) défini dans une autre base de données dans SQL2k8?

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

Question

J'ai un tableau type défini dans une base de données. Il est utilisé comme paramètre de table d'une valeur dans une procédure stockée. Je voudrais appeler cette procédure d'une autre base de données, et pour passer le paramètre, je dois faire référence à ce type défini.

Mais quand je fais DECLARE @table dbOtherDatabase.dbo.TypeName, il me dit que The type name 'dbOtherDatabase.dbo.TypeName' contains more than the maximum number of prefixes. The maximum is 1.

Comment pourrais-je faire référence à ce type de table?

Était-ce utile?

La solution

types définis par l'utilisateur Cross-base de données semble fonctionner uniquement pour les types basés sur CLR. Voir ce forum et MSDN (plus de commentaires).

Autres conseils

vous pouvez essayer d'utiliser 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

et si cela ne vous devrez peut-être pas travailler pour créer une procédure d'emballage dans la DB à distance, où l'on passe dans une chaîne CSV et le grand écart de la procédure d'emballage et crée la table (en utilisant maintenant le type de table local) puis passer dans la procédure actuelle. Voir cette réponse pour une explication sur la façon de diviser une chaîne CVS.

Pouvez-vous pas définir exactement le type dans les deux bases de données.

Modifier

Voir cet article sur la façon de faire ce que vous avez besoin

Alors qu'il ya pour ce thread, mais je tentais de faire la même chose et a été ennuyé par la même restriction.

Ne pas déclarer une table @ mais utiliser une table # qui peut être appelé à partir de la chaîne exec où la base de données peut être commuté à celui avec le type de tableau.

par exemple.

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top