2008-10-03 18 views
14

इसमैं संग्रहित प्रक्रिया से डेटा को एक temp तालिका में कैसे प्राप्त कर सकता हूं?

Select * into #tmp exec my_stp; 

my_stp प्रत्येक पंक्ति में दो कॉलम के साथ 10 डेटा पंक्तियों रिटर्न की तरह कुछ के लिए खोज रहे Sybase एएसई 15. पर काम कर रहा हूँ।

+0

यदि आप साइबेस पर काम कर रहे हैं तो ypou mysql के साथ सवाल क्यों टैग किया? –

+0

एफवाईआई साइबेस एक * कंपनी * डेटाबेस उत्पाद नहीं है। क्या आप एएसई, एसक्यूएल कहीं भी, या साइबेस IQ के बारे में बात कर रहे हैं? –

+0

मुझे तुम्हारा दर्द महसूस होता है। एएसई के तहत, ऐसा कोई आसान समाधान नहीं लगता है। आप या तो एस/पी संशोधित करते हैं, या इनलाइन को फिर से बनाते हैं। मैंने सोचा कि एक अस्थायी तालिका में एक एस/पी "इन" चलाने का कोई तरीका था (एस/पी को संशोधित किए बिना!), लेकिन मुझे यह नहीं मिल रहा है। *** Sybase के लोगों को एक PostgreSQL मैनुअल या कुछ के साथ पीटा जाना चाहिए, मुझे लगता है। ड्रैट, एक अन्यथा बेकार एस/पी मुझे नकल करने के लिए बंद। *** मैं वास्तव में जानना चाहूंगा कि यह कभी हल हो जाता है (एसक्यूएल कहीं भी बाहर)। – Roboprog

उत्तर

1
नहीं

Sybase के बारे में निश्चित है, लेकिन एसक्यूएल सर्वर में निम्नलिखित काम करना चाहिए:

सम्मिलित #tmp (col1, col2, col3 ...) कार्यकारी my_stp जांच

+1

धन्यवाद वैलेरियन। यह sybase में काम नहीं करता है। – user21246

1

आप चाहे राज्य नहीं है ' संग्रहीत प्रक्रिया एक से अधिक मान देता है। यह केवल एक मान देता है, तो आप निम्न कर सकते हैं: अपने एसपी मूल्य से अधिक रिटर्न

--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 

तो आप एसपी में उत्पादन चर निर्धारित करना होगा। Sybase मैनुअल http://manuals.sybase.com/onlinebooks/group-as/asg1250e/sqlug/@Generic__BookTextView/44105;pt=44072

से "एक संग्रहीत प्रक्रिया कई मूल्यों लौट सकते हैं;।। प्रत्येक संग्रहीत प्रक्रिया में और बुला बयान में एक आउटपुट चर के रूप में परिभाषित किया जाना चाहिए उत्पादन कीवर्ड कार्यकारी बाहर को संक्षिप्त किया जा सकता है myproc @a = @myvara out, @b = @myvarb बाहर "

आप यह नहीं कहते कि आप किस sybase पर काम कर रहे हैं। उपरोक्त सभी एएसई 12.5 के लिए मान्य है।

3

Sybase एसक्यूएल कहीं भी में,

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

isql के तहत काम नहीं करता है :( – Arkadiy

7

एएसई 15 में मेरा मानना ​​है कि आप कार्यों का उपयोग कर सकते हैं, लेकिन वे multirow डेटासेट के साथ मदद करने के लिए नहीं जा रहे हैं।

यदि आपकी संग्रहित प्रो "किसी अन्य से col1, col2 का चयन करें" के साथ डेटा लौटा रही है तो उस डेटा को पकड़ने का कोई तरीका नहीं है, यह सिर्फ क्लाइंट पर वापस बहता है।

आप क्या कर सकते हैं डेटा सीधे डेटा तालिका में डालें। यह थोड़ा मुश्किल हो सकता है जैसे कि आप स्पोक के भीतर अस्थायी तालिका बनाते हैं, जब स्पोक खत्म हो जाने के बाद इसे हटा दिया जाता है और आपको सामग्री देखने को नहीं मिलता है। इसके लिए चाल स्पोक के बाहर अस्थायी तालिका बनाना है, लेकिन इसे स्पोक से संदर्भित करना है। यहां कड़ी बात यह है कि हर बार जब आप स्पोक को फिर से बनाते हैं तो आपको अस्थायी तालिका बनाना होगा, या आपको "तालिका नहीं मिली" त्रुटियां मिलेंगी।


    --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 

कोड को चलाने के लिए:


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

exec my_stp 
go 

select * from #mine 
drop table #mine 
go 
5

मैं सिर्फ इस समस्या का सामना करना पड़ा है, और कभी नहीं की तुलना में बेहतर देर हो गई ...

यह संभव है, लेकिन बट में एक राक्षसी दर्द , जिसमें एक साइबेस "proxy table" शामिल है जो एक अन्य स्थानीय या दूरस्थ वस्तु (तालिका, प्रक्रिया, दृश्य) के लिए एक स्टैंडिन है। निम्नलिखित 12.5 में काम करता है, नए संस्करणों का उम्मीद है कि इसे करने का बेहतर तरीका है।

मान लीजिए कि आप एक संग्रहीत proc के रूप में परिभाषित किया है दो:

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

tempdb पर स्विच:

:

use tempdb 

तो एक प्रॉक्सी मेज, जहां कॉलम परिणाम सेट से मेल खाते हैं बनाने

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" 

नोट के अंक:

  • "लूपबैक" Sybase बराबर स्थानीय होस्ट की है, लेकिन आप सर्वर के sysservers तालिका में पंजीकृत किसी भी सर्वर के लिए यह स्थानापन्न कर सकते हैं।
  • _timestamp पैरामीटर को @timestamp में अनुवादित किया जाता है जब Sybase संग्रहीत प्रो निष्पादित करता है, और इस तरह घोषित सभी पैरामीटर कॉलम को शून्य के रूप में परिभाषित किया जाना चाहिए।

बाद ही आप अपना डाटाबेस से इस तरह की मेज से चुन सकते हैं:

declare @myTimestamp datetime 
set @myTimestamp = getdate() 

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

कौन सा पर्याप्त सरल है। तो अस्थायी तालिका में सम्मिलित करने के लिए, यह पहली बनाने के लिए:

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) 
) 

और गठबंधन:

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

यह चयनित कथन में '_extractTimestamp' के बजाय' _timestamp' होना चाहिए। इसे 'मौजूदा तालिका बनाने' में परिभाषित कॉलम से मेल खाना चाहिए। – jack3694078

+0

अपडेट किया गया, धन्यवाद। –

0

my_stp कंप्यूटिंग विभिन्न तालिकाओं से मूल्यों से डेटा को आबाद करने है, तो आप जो वास्तव में करता है एक बराबर दृश्य बना सकते हैं my_stp जैसा ही है।

CREATE VIEW My_view 
AS 
/* 
    My_stp body 
*/ 


Then select data from view 
SELECT * INTO #x FROM my_view 
संबंधित मुद्दे

 संबंधित मुद्दे