Передача таблицы. Значения параметра для хранимой процедуры в разных базах данных.

Я использую SQL Server 2008.

Как передать Значения таблицы в Хранимую процедуру в разных Базах данных, но на том же сервере?

Должен ли я создать тот же тип таблицы в обеих базах данных?

Пожалуйста, дайте пример или ссылку в соответствии с проблемой.

Спасибо за любую помощь.

Ответ 1

В ответ на этот комментарий (если я прав, и использование TVP между базами данных невозможно):

Какой выбор у меня в этой ситуации? Использование типа XML?

Пуристский подход должен был бы сказать, что если обе базы данных работают с одними и теми же данными, их следует объединить в одну базу данных. Прагматик понимает, что это не всегда возможно, но поскольку вы, очевидно, можете изменить как вызывающего абонента, так и вызываемого, возможно, просто используйте временную таблицу, о которой знают хранимые procs.


Я не считаю возможным - вы не можете ссылаться на тип таблицы из другой базы данных и даже с идентичными определениями типов в обеих БД, значение одного типа не присваивается другому.


Вы не передаете временную таблицу между базами данных. Временная таблица всегда хранится в tempdb и доступна для вашего соединения, пока соединение открыто и таблица temp не отбрасывается.

Итак, вы создаете таблицу темпа в вызывающем:

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

И затем в вызываемом:

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

Ответ 2

Табличные UDT действительны только для сохраненных процедур в одной базе данных.

Итак, да, вам нужно будет создавать тип на каждом сервере и ссылаться на него в хранимых процедурах - например, просто запустите первую часть этого примера в обеих БД http://msdn.microsoft.com/en-us/library/bb510489.aspx.

Если вам не нужна эффективность, вы всегда можете использовать другие методы - например, передать параметр документа xml или иметь s.p. ожидайте временную таблицу с входными данными.

Изменить: добавлен пример

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 

Недостатком является то, что есть две копии данных. Но вы могли бы одновременно запускать пакет против каждой базы данных. Является ли это лучше, чем использование таблицы таблицы, действительно зависит от того, какие размеры обработки/данных у вас есть - кстати, чтобы использовать временную таблицу из s.p. вы просто обращаетесь к нему с s.p. код (и он терпит неудачу, если он не существует).