2012-03-02 2 views
10

Я использую SQL Server 2008.Передача таблицы Значение параметра хранимой процедуры в разных базах данных

Как я могу передать Таблица Ценится параметра хранимой процедуры через различных баз данных, но тот же сервер?

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

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

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

+0

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

+0

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

ответ

11

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

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

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


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


Вы не делаете Пропустите на временную таблицу между базами данных. Временная таблица всегда хранится в 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 
+0

и как я могу пройти временную таблицу между базами данных. Можете ли вы привести пример? Благодарю. – hgulyan

+1

@hgulyan - добавлен пример в нижней части моего ответа - вы его вообще не пропускаете. –

+0

Ничего себе, не знал этого. Благодарю. Прекрасно работает! – hgulyan

1

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

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

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

Edit: добавлен пример

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. вы просто обращаетесь к нему с сайта. код (и он не работает, если он не существует).

+0

Не работает. У меня есть эта ошибка «Столкновение типа Operand: PersonalMessages несовместимо с PersonalMessages» – hgulyan

+0

Да, одно ограничение заключается в том, что при объявлении таблицы он использует тип данных, привязанный к текущему контексту базы данных. Поэтому вам нужно будет: «использовать db1», создать таблицу и вызвать proc, go, «use db2» и т. Д. Вы можете переключиться на передачу таблицы temp на s.p. или заполнить глобальную таблицу temp, а затем передать через отдельную переменную таблицы для каждого db. –

+0

, но вопрос заключается в использовании типа таблицы между двумя базами данных. – hgulyan

Смежные вопросы