2012-03-02 16 views
10

Estoy usando SQL Server 2008.Pasando la tabla Valor del parámetro para el procedimiento almacenado en diferentes bases de datos

¿Cómo puedo pasar valores de tabla parámetro a un procedimiento almacenado través de bases de datos diferentes , pero el mismo servidor?

¿Debo crear el mismo tipo de tabla en ambas bases de datos?

Por favor, dé un ejemplo o un enlace de acuerdo con el problema.

Gracias por cualquier tipo de ayuda.

+0

que no creen que sea posible - no se puede hacer referencia a un tipo de tabla desde otra base de datos, e incluso con definiciones de tipo idénticas en ambas bases de datos, un valor de un tipo no es asignable a la otra. –

+0

¿Qué opción tengo en esta situación? ¿Usando el tipo XML? – hgulyan

Respuesta

11

En respuesta a este comentario (si estoy en lo correcto y que el uso de TVP entre bases de datos no es posible):

Qué opción tengo en esta situación? ¿Usando el tipo XML?

El enfoque purista sería decir que si ambas bases de datos trabajan con los mismos datos, deberían fusionarse en una única base de datos. El pragmático se da cuenta de que esto no siempre es posible, pero dado que obviamente puede cambiar tanto la persona que llama como la llamada, tal vez solo use una tabla temporal que ambos procesos almacenados conocen.


No creo que sea posible - no se puede hacer referencia a un tipo de tabla de otra base de datos, e incluso con las definiciones de tipo idénticas en ambos DBs, un valor de un tipo no se puede ceder a la otro.


usted no pase la tabla temporal entre bases de datos. Una tabla temporal siempre se almacena en tempdb y su conexión puede acceder a ella, siempre que la conexión esté abierta y la tabla temporal no se elimine.

Así, se crea la tabla temporal de la persona que llama:

CREATE TABLE #Values (ID int not null,ColA varchar(10) not null) 
INSERT INTO #Values (ID,ColA) 
/* Whatever you do to populate the table */ 
EXEC OtherDB..OtherProc 

Y luego en el destinatario de la llamada:

CREATE PROCEDURE OtherProc 
/* No parameter passed */ 
AS 
    SELECT * from #Values 
+0

y cómo puedo pasar una tabla temporal entre las bases de datos. ¿Puedes dar un ejemplo sobre esto? Gracias. – hgulyan

+1

@hgulyan: agregué un ejemplo en la parte inferior de mi respuesta, no lo pasa en absoluto. –

+0

Guau, no lo sabía. Gracias. ¡Funciona genial! – hgulyan

1

Los UDT de tabla solo son válidos para los procesos almacenados dentro de la misma base de datos.

Así que sí, tendría que crear el tipo en cada servidor y hacer referencia a él en los procesos almacenados, p. simplemente ejecute la primera parte de este ejemplo en ambos DB http://msdn.microsoft.com/en-us/library/bb510489.aspx.

Si no necesita la eficacia siempre puede usar otros métodos, es decir, pasar un parámetro de documento xml o tener el s.p. esperar una tabla temporal con los datos de entrada.

Editar: ejemplo añadido

create database Test1 
create database Test2 
go 
use Test1 
create type PersonalMessage as TABLE 
(Message varchar(50)) 
go 
create proc InsertPersonalMessage @Message PersonalMessage READONLY AS 
    select * from @Message 
go 
use Test2 
create type PersonalMessage as TABLE 
(Message varchar(50)) 
go 
create proc InsertPersonalMessage @Message PersonalMessage READONLY AS 
    select * from @Message 
go 
use Test1 
declare @mymsg PersonalMessage 
insert @mymsg select 'oh noes' 
exec InsertPersonalMessage @mymsg 
go 
use Test2 
declare @mymsg2 PersonalMessage 
insert @mymsg2 select 'oh noes' 
exec InsertPersonalMessage @mymsg2 

desventaja es que hay dos copias de los datos. Pero podría ejecutar el lote contra cada base de datos simultáneamente. Si esto es mejor que usar una tabla de tabla realmente depende de los tamaños de procesamiento/datos que tenga, por cierto, para usar una tabla temporal de un s.p. solo tiene acceso desde el s.p. código (y falla si no existe).

+0

No funciona. Tengo este error "Operand type clash: PersonalMessages no es compatible con PersonalMessages" – hgulyan

+0

Sí, una restricción es que cuando declaras la tabla, usa el tipo de datos vinculado al contexto actual de la base de datos. Entonces tendría que hacer: "use db1", cree tabla y llame a proc, vaya, "use db2", etc. Podría pasar a pasar una tabla temporal al s.p. o rellene una tabla temporal global, luego pase a través de una variable de tabla separada para cada db. –

+0

pero la pregunta está en utilizar el tipo de tabla entre dos bases de datos. – hgulyan

Cuestiones relacionadas