2012-06-27 21 views
9

में SELECT कथन के अंदर EXEC का उपयोग करके मुझे select खंड के अंदर exec का उपयोग करने की आवश्यकता है। निष्पादन के लिए क्वेरी तालिका के कॉलम के अनुसार बनाई गई है, जिस पर उपयोग किए जाने वाले चयन खंड पर।SQL सर्वर

SELECT distinct 
    MTMain.[TableName], 
    MTMain.[TableFKey], 
    (select IsActive (exec GetStringForIsActive MTMain.[TableName],MTMain.[TableFKey])) 
FROM 
    [MasterTableForLanguage] MTMain 

यहाँ, GetStringForIsActive संग्रहीत प्रक्रिया मैं MasterTableForLanguage से चयनित प्रत्येक पंक्ति के लिए निष्पादित करने के लिए चाहते हैं: क्या मैं करना चाहता हूँ निम्नलिखित की तरह कुछ है।
stored procedureEXEC का उपयोग निम्न स्ट्रिंग निष्पादित करने के लिए

select IsActive from [TableName] where PKID= cast([TableFKey] as int) 

TableName जाएगा और TableFKey संग्रहीत प्रक्रिया की जानकारी के लिए किया जाएगा।

+4

आप संग्रहीत प्रक्रिया के बजाय कार्यों का उपयोग करना चाहिए आप उन्हें चयन खंड – Boomer

+0

पोस्ट अपने proc अंदर उपयोग करना चाहते हैं। मुझे नहीं पता कि आप proc के अंदर क्या करते हैं, शायद आप इसे किसी फ़ंक्शन में बदल सकते हैं या इसे उप-चयन के रूप में बेहतर तरीके से हल कर सकते हैं। – YvesR

+0

मैं स्ट्रिंग के निष्पादन के लिए संग्रहीत प्रक्रिया का उपयोग कर रहा हूं। मुझे इसे इस तरह से करने की ज़रूरत है क्योंकि मुझे तालिका के रूप में कॉलम [टेबलनाम] का उपयोग करने की आवश्यकता है और जांचें कि [तालिकाफ़ीकी] मान उस तालिका के विशेष कॉलम में निकलता है या नहीं। –

उत्तर

3

SELECT क्लॉज में संग्रहीत प्रक्रियाओं के बजाय फ़ंक्शंस का उपयोग करें।

संपादित:

कि समारोह

CREATE FUNCTION function1 (@TableName nvarchar(10),@TableFKey nvarchar(10)) 
RETURNS nvarchar(100) AS 
BEGIN 
    -- do whatever here 
END 

बनाने तो

SELECT distinct 
    MTMain.[TableName], 
    MTMain.[TableFKey], 
    function1(MTMain.[TableName],MTMain.[TableFKey]) 
FROM 
    [MasterTableForLanguage] MTMain 

यह आप मतलब?

+1

ऐसी कई चीजें हैं जो किसी फ़ंक्शन में नहीं की जा सकती हैं, हालांकि एक प्रो में किया जा सकता है। –

+1

आप अभी भी संग्रहीत प्रक्रिया को फ़ंक्शन से कॉल नहीं कर सकते हैं। अपनी संग्रहीत प्रक्रिया को फ़ंक्शन – Boomer

+1

में कनवर्ट करने का प्रयास करें, मुझे फ़ंक्शन के अंदर EXEC का उपयोग करने की आवश्यकता है। प्रश्न पर मेरी टिप्पणी की जांच करें। –

1

यदि आप टेबल नाम, टेबलफकी और IsActive को वापस करने के लिए अपनी संग्रहीत प्रक्रिया GetStringForIsActive को संशोधित कर सकते हैं, तो आप प्रत्येक पंक्ति के लिए निष्पादित करने के लिए कर्सर का उपयोग कर सकते हैं और परिणामों को एक temp तालिका में जोड़ सकते हैं।

अर्थात्:

exec GetStringForIsActive 'TableName', 'TableFKey' 
returns 
select [TableName], [TableFKey], IsActive from [TableName] where PKID= cast([TableFKey] as int) 

कोड इस तरह होगा:

declare @TableName nvarchar(50) 
declare @TableFKey nvarchar(50) 
declare @Results table (TableName nvarchar(50), TableFKey nvarchar(50), IsActive bit) 

declare TableCursor cursor fast_forward for 
    select TableName, TableFKey from MasterTableForLanguage 

open TableCursor 

fetch next from TableCursor into @TableName, @TableFKey 

if @@FETCH_STATUS <> -1 
    print 'MasterTableForLanguage check' 

while (@@FETCH_STATUS <> -1) 
begin 


    insert into @Results 
    exec GetStringForIsActive @TableName, @TableFKey 

    fetch next from TableCursor into @TableName, @TableFKey 

end 
close TaleCursor 
deallocate TableCursor 

select * from @Results 
0

ठीक है, मैं पूर्ण सवाल का जवाब देने लगता है, मैं एक संग्रहीत प्रक्रिया एक SELECT कथन EXEC हैं पर विश्वास नहीं करते , यह बस चयन करें।

आप अपनी वर्तमान प्रो को EXEC करते हैं और इसे वर्र्स पास करते हैं, और यह चयनित स्टेटमेंट पर आधारित मान देता है। यह उस कथन का निष्पादन नहीं कर रहा है, बस एक चयन कर रहा है। मेरे पास कुछ SQL एजेंट प्रक्रियाओं में दैनिक उपयोग की जाने वाली कई संग्रहित प्रोसेस हैं, वे सभी विभिन्न तालिकाओं से पूछने के लिए चयन करते हैं, और उनमें से कोई भी उन क्रियाओं को निष्पादित करने के लिए EXEC को कॉल नहीं करता है। यह मेरा खुद का उदाहरण है:

CREATE PROCEDURE [myproc] 
    @job_ident  INT 
AS 
BEGIN 
    SET NOCOUNT ON; 

    ... 

    SELECT TOP(1) @filter_type = filter_type FROM [place] WHERE [ident] = @job_ident 

    ... 
END 

पहले से आपकी क्वेरी प्रदर्शन करने के लिए एक समारोह के अंदर है कि चयन प्रदर्शन करने के लिए किया जाएगा सबसे प्रभावी तरीका उल्लेख किया है,, इस के समान कुछ मैं करना होगा लगता है:

CREATE FUNCTION ThisFunction (
    @TableName nvarchar(10), 
    @TableFKey nvarchar(10) 
    ) 
    RETURNS nvarchar(100) 
    AS 
     BEGIN 
      RETURN 
      (
       select IsActive from [TableName] where PKID= cast([TableFKey] as int) 
      ) 
     END 

फिर आप वास्तव में कर सकता है के रूप में आप चाहते हैं ...

SELECT distinct 
    MTMain.[TableName], 
    MTMain.[TableFKey], 
    ThisFunction(MTMain.[TableName],MTMain.[TableFKey]) 
FROM 
    [MasterTableForLanguage] MTMain