Передача параметра Table Valued в хранимую процедуру в разных базах данных - PullRequest
10 голосов
/ 02 марта 2012

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

Как передать параметр Table Valued в Хранимая процедура в разных базах данных , но на одном сервере?

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

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

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

Ответы [ 2 ]

11 голосов
/ 02 марта 2012

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

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

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


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


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

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

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
1 голос
/ 02 марта 2012

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

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

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

Редактировать: добавленный пример

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 

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

...