2010-05-20 17 views
6

Tengo un tipo de tabla definido en una base de datos. Se usa como un parámetro de valor de tabla en un procedimiento almacenado. Me gustaría llamar a este procedimiento desde otra base de datos, y para pasar el parámetro, necesito hacer referencia a este tipo definido.¿Cómo se usa un tipo de datos (tabla) definido en otra base de datos en SQL2k8?

Pero cuando lo haga DECLARE @table dbOtherDatabase.dbo.TypeName, me dice que The type name 'dbOtherDatabase.dbo.TypeName' contains more than the maximum number of prefixes. The maximum is 1.

¿Cómo podría hacer referencia a este tipo de tabla?

Respuesta

2

Los tipos definidos por el usuario de bases de datos cruzadas parecen funcionar solo para los tipos basados ​​en CLR. Ver this forum y MSDN (más comentarios).

0

Puede no solo definir el tipo en ambas bases de datos.

Editar

Ver this artículo sobre cómo hacer lo que usted requiere

+1

No funciona :(Si lo hago, me sale "tipo de operando choque: TypeName es incompatible con el nombre de tipo" –

+0

He actualizado mi respuesta con un enlace a un artículo de MSDN que te dice cómo hacerlo –

+0

Esto no funciona. Creo que es como dijo @devio, solo los tipos CLR pueden compartirse entre bases de datos (su enlace no dice esto exactamente, pero podemos entenderlo a partir de esta frase: "Los tipos deben tener el mismo nombre, incluido el mismo nombre CLR, y debe implementarse a través del mismo ensamblado en ambas bases de datos. "). Si realmente es así, ¡los tipos definidos por el usuario parecen chupar! –

0

se podría tratar de usar 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 

y si eso no funciona, puede que tenga que crear un procedimiento envoltorio en el DB remoto, donde se pasa una cadena CSV y el procedimiento envoltorio lo divide y crea la tabla (ahora usando el tipo de tabla local) para luego pasar al procedimiento real. Consulte this answer para obtener una explicación sobre cómo dividir una cadena CVS.

+0

Podría funcionar, pero desafortunadamente esto es algo no podemos hacer aquí: P Por lo general, esta es una práctica de codificación muy mala, por lo que evitamos mucho el uso de secuencias de comandos que no está compilado. EDITAR: y el problema realmente no es llamar al procedimiento. De hecho, el problema es con la declaración de tipo. –

0

Hace un tiempo para este hilo, pero estaba tratando de hacer lo mismo y me molestó la misma restricción.

No declare una tabla @ pero use una tabla # a la que se puede llamar desde una cadena ejecutiva donde la base de datos se puede cambiar a la que tiene el tipo de tabla.

p. Ej.

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

la solución funcionó para mí. gracias – kazim

Cuestiones relacionadas