2008-10-03 30 views
14

đang làm việc trên Sybase ASE 15. Tìm kiếm cái gì như thế nàyLàm cách nào để lấy dữ liệu từ quy trình được lưu trữ vào bảng tạm thời?

Select * into #tmp exec my_stp; 

my_stp trả về 10 dòng dữ liệu với hai cột trong mỗi hàng.

+0

Nếu bạn đang làm việc trên Sybase tại sao ypou gắn thẻ câu hỏi với mysql? –

+0

FYI Sybase là một công ty * * không phải là sản phẩm cơ sở dữ liệu. Bạn đang nói về ASE, SQL Anywhere, hay Sybase IQ? –

+0

Tôi cảm thấy đau đớn của bạn. Theo ASE, có vẻ như không có giải pháp dễ dàng cho việc này. Bạn có thể sửa đổi s/p hoặc tạo lại nội tuyến. Tôi nghĩ rằng có một cách để chạy một s/p "vào" một bảng tạm thời (KHÔNG sửa đổi s/p!), Nhưng tôi không thể tìm thấy nó. *** Những kẻ ở Sybase cần phải bị đánh bại bằng một tài liệu hướng dẫn sử dụng PostgreSQL hoặc một cái gì đó, tôi đoán vậy. Drat, tắt để lặp lại một cách khác vô ích s/p tôi đoán. *** Tôi thực sự muốn biết nếu điều này bao giờ được giải quyết (bên ngoài SQL Anywhere). – Roboprog

Trả lời

1

Không chắc về Sybase, nhưng trong SQL Server sau đây nên làm việc:

INSERT INTO #tmp (col1, col2, col3 ...) exec my_stp

+1

Cảm ơn Valerion. Điều đó không hoạt động trong cơ sở. – user21246

1

Bạn không nêu rõ bạn' thủ tục lưu trữ được trả về nhiều hơn một giá trị. Nếu nó chỉ trả về một giá trị thì bạn có thể làm như sau:

--create store procedure 
create procedure sp_returnOne 
as 
BEGIN 
return 1 
END 

--create temp table 
create table #tt (
    col1 int null 
) 

--populate temp table #tt with stored procedure 

declare @result int 
exec @result = sp_returnOne 
insert into #tt values (@result) 

select * from #tt 

drop table #tt 

Nếu sp của bạn trả về nhiều hơn giá trị sau đó bạn sẽ phải xác định các biến đầu ra trong các sp. Từ hướng dẫn Sybase http://manuals.sybase.com/onlinebooks/group-as/asg1250e/sqlug/@Generic__BookTextView/44105;pt=44072

"Một thủ tục lưu trữ có thể trả lại nhiều giá trị;. Từng phải được định nghĩa như là một biến đầu ra trong thủ tục lưu trữ và trong các báo cáo kêu gọi Các từ khóa đầu ra có thể được viết tắt là ra exec. myproc @a = @myvara, @b = @myvarb out "

Bạn không nói phiên bản Sybase bạn đang làm việc. Tất cả những điều trên đều có hiệu lực đối với ASE 12.5.

3

Trong Sybase SQL Anywhere,

INSERT INTO #tmp (col1,col2,col3...) select * from my_stp() 
+0

Không hoạt động theo isql: ( – Arkadiy

7

Trong ASE 15 Tôi tin rằng bạn có thể sử dụng chức năng này, nhưng họ sẽ không giúp đỡ với bộ dữ liệu multirow.

Nếu proc được lưu trữ của bạn đang trả về dữ liệu với "select col1, col2 from anywhere" thì không có cách nào lấy dữ liệu đó, nó sẽ quay trở lại máy khách.

Việc bạn có thể làm là chèn dữ liệu trực tiếp vào bảng tạm thời. Điều này có thể hơi phức tạp một chút như thể bạn tạo bảng tạm thời trong sproc nó bị xóa khi sproc kết thúc chạy và bạn không thể xem nội dung. Bí quyết cho việc này là tạo ra bảng tạm thời bên ngoài sproc, nhưng để tham khảo nó từ sproc. Các bit cứng ở đây là mỗi khi bạn tạo lại các sproc bạn phải tạo bảng tạm thời, hoặc bạn sẽ nhận được "bảng không tìm thấy" lỗi.


    --You must use this whole script to recreate the sproc  
    create table #mine 
    (col1 varchar(3), 
    col2 varchar(3)) 
    go 
    create procedure my_stp 
    as 
    insert into #mine values("aaa","aaa") 
    insert into #mine values("bbb","bbb") 
    insert into #mine values("ccc","ccc") 
    insert into #mine values("ccc","ccc") 
    go 
    drop table #mine 
    go 

trình để chạy mã:


create table #mine 
(col1 varchar(3), 
col2 varchar(3)) 
go 

exec my_stp 
go 

select * from #mine 
drop table #mine 
go 
5

Tôi vừa phải đối mặt với vấn đề này, và muộn còn hơn không ...

Đó là doable, nhưng một nỗi đau khổng lồ ở mông , liên quan đến Sybase "proxy table" là một standin cho một đối tượng địa phương hoặc từ xa khác (bảng, thủ tục, chế độ xem). Các công trình sau đây trong 12.5, các phiên bản mới hơn hy vọng có một cách làm tốt hơn.

Hãy nói rằng bạn có một proc lưu trữ định nghĩa là:

create procedure mydb.mylogin.sp_extractSomething (
@timestamp datetime) as 
select column_a, column_b 
    from sometable 
    where timestamp = @timestamp 

tắc đầu tiên để tempdb:

use tempdb 

Sau đó tạo một bảng Proxy nơi các cột phù hợp với tập kết quả:

create existing table myproxy_extractSomething (
column_a int not null, -- make sure that the types match up exactly! 
column_b varchar(20) not null, 
_timestamp datetime null, 
primary key (column_a)) external procedure at "loopback.mydb.mylogin.sp_extractSomething" 

Điểm đáng chú ý:

  • "loopback" là Sybase tương đương của máy chủ cục bộ, nhưng bạn có thể thay thế nó cho bất kỳ máy chủ nào được đăng ký trong bảng máy chủ sysservers của máy chủ.
  • Tham số _timestamp được dịch thành @timestamp khi Sybase thực thi proc được lưu trữ và tất cả các cột tham số được khai báo như thế này phải được định nghĩa là rỗng.

Sau đó bạn có thể chọn từ bảng như thế này từ db của riêng bạn:

declare @myTimestamp datetime 
set @myTimestamp = getdate() 

select * 
from tempdb..myproxy_extractSomething 
where _timestamp = @myTimestamp 

Đó là đủ đơn giản. Để sau đó chèn vào một bảng tạm thời, tạo ra nó đầu tiên:

create table #myTempExtract (
    column_a int not null, -- again, make sure that the types match up exactly 
    column_b varchar(20) not null, 
    primary key (column_a) 
) 

và kết hợp:

insert into #myTempExtract (column_a, column_b) 
select column_a, column_b 
    from tempdb..myproxy_extractSomething 
    where _timestamp = @myTimestamp 
+1

Nó phải là '_timestamp' thay vì' _extractTimestamp' trong câu lệnh select. Nó phải khớp với cột được định nghĩa trong 'create existing table'. – jack3694078

+0

Cập nhật, cảm ơn. –

0

Nếu my_stp được Populating dữ liệu bằng các giá trị từ các bảng khác nhau tính toán, bạn có thể tạo một cái nhìn tương đương mà không chính xác giống như my_stp.

CREATE VIEW My_view 
AS 
/* 
    My_stp body 
*/ 


Then select data from view 
SELECT * INTO #x FROM my_view 
Các vấn đề liên quan