Używam SQL Server 2008.

Jak mogę przekazać parametr Table Valued do Procedury przechowywanej w różnych bazach danych, ale na tym samym serwerze?

Czy powinienem utworzyć ten sam typ tabeli w obu bazach danych?

Proszę podać przykład lub link w zależności od problemu.

Dzięki za wszelką pomoc.

10
hgulyan 2 marzec 2012, 14:32

2 odpowiedzi

Najlepsza odpowiedź

W odpowiedzi na ten komentarz (o ile mam rację i że używanie TVP między bazami danych nie jest możliwe):

Jaki mam wybór w tej sytuacji? Używasz typu XML?

Purystyczne podejście polegałoby na stwierdzeniu, że jeśli obie bazy danych pracują z tymi samymi danymi, należy je połączyć w jedną bazę danych. Pragmatyk zdaje sobie sprawę, że nie zawsze jest to możliwe - ale ponieważ możesz oczywiście zmienić zarówno wołającego, jak i wywoływanego, może po prostu użyj tabeli tymczasowej, o której wiedzą oba przechowywane procedury.


Nie wierzę, że jest to możliwe — nie można odwoływać się do typu tabeli z innej bazy danych, a nawet przy identycznych definicjach typów w obu bazach danych wartość jednego typu nie może być przypisana do drugiego.


Nie przekazujesz tabeli tymczasowej między bazami danych. Tabela tymczasowa jest zawsze przechowywana w tempdb i jest dostępna dla Twojego połączenia, o ile połączenie jest otwarte, a tabela tymczasowa nie jest usuwana.

Tak więc tworzysz tabelę tymczasową w rozmówcy:

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

A potem w rozmówcy:

CREATE PROCEDURE OtherProc
/* No parameter passed */
AS
    SELECT * from #Values
11
Damien_The_Unbeliever 2 marzec 2012, 15:25

Tabele UDT są ważne tylko dla przechowywanych procesów w tej samej bazie danych.

Więc tak, musiałbyś utworzyć typ na każdym serwerze i odwoływać się do niego w przechowywanych procesach - np. po prostu uruchom pierwszą część tego przykładu w obu bazach danych http://msdn.microsoft. com/en-us/library/bb510489.aspx.

Jeśli nie potrzebujesz wydajności, zawsze możesz skorzystać z innych metod - np. przekazać parametr dokumentu xml lub zlecić s.p. oczekuj tabeli tymczasowej z danymi wejściowymi.

Edytuj: Dodano przykład

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 

Wadą jest to, że istnieją dwie kopie danych. Ale możesz uruchomić partię w każdej bazie danych jednocześnie. To, czy jest to lepsze niż użycie tabeli tabeli, zależy od tego, jakie masz rozmiary przetwarzania/danych – btw, aby użyć tabeli tymczasowej od s.p. po prostu uzyskujesz do niego dostęp z s.p. kod (i kończy się niepowodzeniem, jeśli nie istnieje).

1
Peter Wishart 2 marzec 2012, 15:32