2012-03-02 17 views
10

Tôi đang sử dụng SQL Server 2008.Bàn thông số Tham số có giá trị cho quy trình được lưu trữ trên các cơ sở dữ liệu khác nhau

Làm thế nào tôi có thể vượt qua Bảng Quý tham số để một Thủ tục lưu trữ trên Cơ sở dữ liệu khác nhau, nhưng cùng một máy chủ?

Tôi có nên tạo cùng một loại bảng trong cả hai cơ sở dữ liệu không?

Vui lòng cung cấp ví dụ hoặc liên kết theo sự cố.

Cảm ơn bạn đã giúp đỡ.

+0

Tôi không tin rằng nó có thể - bạn không thể tham chiếu đến một loại bảng từ một cơ sở dữ liệu khác và thậm chí với các định nghĩa kiểu giống hệt nhau trong cả hai DB, một giá trị của một loại không thể gán cho loại kia. –

+0

Tôi có lựa chọn nào trong tình huống này? Sử dụng loại XML? – hgulyan

Trả lời

11

Để đối phó với nhận xét này (nếu tôi đúng và rằng việc sử dụng cơ sở dữ liệu TVPs giữa là không thể):

lựa chọn gì tôi có trong tình huống này? Sử dụng loại XML?

Cách tiếp cận thuần túy sẽ là nói rằng nếu cả hai cơ sở dữ liệu đang làm việc với cùng một dữ liệu, chúng phải được hợp nhất vào một cơ sở dữ liệu duy nhất. Nhà thực dụng nhận ra rằng điều này không phải lúc nào cũng có thể - nhưng vì bạn rõ ràng có thể thay đổi cả người gọi và callee, có thể chỉ cần sử dụng bảng tạm thời mà cả hai procs đã lưu đều biết.


Tôi không tin rằng nó có thể - bạn không thể tham khảo một loại bảng từ cơ sở dữ liệu khác, và ngay cả với định nghĩa kiểu giống hệt nhau trong cả DBS, một giá trị của một loại không thể chuyển nhượng cho khác.


Bạn không qua bảng tạm thời giữa cơ sở dữ liệu. Bảng tạm thời luôn được lưu trữ trong tempdb và có thể truy cập được vào kết nối của bạn, miễn là kết nối được mở và bảng tạm thời không bị giảm.

Vì vậy, bạn tạo bảng tạm thời trong người gọi:

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 

Và sau đó trong callee:

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

và làm thế nào tôi có thể vượt qua một bảng tạm thời giữa các cơ sở dữ liệu. Bạn có thể cung cấp một ví dụ về điều này? Cảm ơn. – hgulyan

+1

@hgulyan - đã thêm ví dụ ở cuối câu trả lời của tôi - bạn hoàn toàn không vượt qua được. –

+0

Wow, không biết điều đó. Cảm ơn. Hoạt động tuyệt vời! – hgulyan

1

Bảng UDT chỉ hợp lệ cho các procs được lưu trữ trong cùng một cơ sở dữ liệu.

Vì vậy, có bạn sẽ phải tạo loại trên mỗi máy chủ và tham chiếu nó trong các procs được lưu trữ - ví dụ: chỉ cần chạy phần đầu tiên của ví dụ này trong cả hai DBs http://msdn.microsoft.com/en-us/library/bb510489.aspx.

Nếu bạn không cần hiệu quả, bạn luôn có thể sử dụng các phương pháp khác - ví dụ: chuyển thông số tài liệu xml hoặc có s.p. mong đợi một bảng tạm thời với dữ liệu đầu vào.

Edit: thêm ví dụ

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 

Nhược điểm là có hai bản sao của dữ liệu. Nhưng bạn sẽ có thể chạy lô đối với mỗi cơ sở dữ liệu cùng một lúc. Cho dù điều này có tốt hơn không khi sử dụng một bảng bảng thực sự là những gì bạn đang xử lý/kích thước dữ liệu - btw để sử dụng một bảng tạm thời từ một s.p. bạn chỉ cần truy cập nó từ s.p. mã (và nó không thành công nếu nó không tồn tại).

+0

Nó không hoạt động. Tôi đã có lỗi này "Operand type clash: PersonalMessages không tương thích với PersonalMessages" – hgulyan

+0

Có một hạn chế là khi bạn khai báo bảng, nó sử dụng kiểu dữ liệu được ràng buộc với ngữ cảnh cơ sở dữ liệu hiện tại. Vì vậy, bạn phải làm: "sử dụng db1", tạo bảng và gọi proc, đi, "sử dụng db2" vv Bạn có thể chuyển sang chuyển bảng tạm thời sang s.p. hoặc điền bảng tạm thời toàn cầu, sau đó chuyển qua một biến bảng riêng biệt cho mỗi db. –

+0

nhưng câu hỏi là sử dụng loại bảng giữa hai cơ sở dữ liệu. – hgulyan

Các vấn đề liên quan