2009-06-12 19 views
5

में 'से' खंड में तालिका नाम के लिए एक चर का उपयोग करना मेरे पास एक यूडीएफ है जो किसी तालिका से डेटा पूछताछ करता है। हालांकि, तालिका को पैरामीटर के रूप में निश्चित करने की आवश्यकता है। उदाहरण के लिए मेरे पास है नहीं कर सकते हैं:।SQL सर्वर 2008

* का चयन करें [dbo] से [TableA]

मैं की तरह कुछ की जरूरत है:।

* का चयन करें [dbo] से [@ TableName]

उपर्युक्त रेखा काम नहीं करती है, और यूडीएफ मुझे क्वेरी को स्ट्रिंग के रूप में सेट करने और निष्पादन() को प्रतिबंधित करने से रोकता है। मैं इसे एक प्रक्रिया में कर सकता हूं, लेकिन मैं यूडीएफ से प्रक्रिया को कॉल नहीं कर सकता।

क्या कोई जानता है कि मैं इसे किसी प्रकार का भारी स्विच स्टेटमेंट के बिना यूडीएफ में कैसे पूरा कर सकता हूं?

+0

मैं किसी भी भाग्य के साथ दूसरे दिन उस सटीक चीज़ को करने की कोशिश कर रहा था। मुझे आशा है कि कोई जानता है! – Gabe

उत्तर

7

यह नहीं किया जा सकता है, गतिशील एसक्यूएल कार्यों में समर्थित नहीं है। Executing dynamic SQL in a SQLServer 2005 function

+0

लिंक के लिए धन्यवाद! – DaveK

+1

सामान्य यूडीएफ (जो मैंने पूछा है) का उपयोग करते समय यह उत्तर सही है। मैं सी # में लिखे गए सीएलआर यूडीएफ के साथ अपनी समस्या का समाधान करने में सक्षम था। – DaveK

3

आप एक यूडीएफ clr कि गतिशील एसक्यूएल कर सकते हैं लिख सकते हैं:

इस अतः प्रश्न देखें। मुझे पहले इसे लागू करना पड़ा है। यह बहुत चिकना है।

+0

सही, लेकिन यह एक विस्तारित सीएलआर समारोह होगा, यूडीएफ नहीं? – Andomar

+0

क्या यह एक प्रश्न में यूडीएफ के तरीके से उपयोग किया जा सकता है? – DaveK

+0

हाँ, लेकिन आपके डीबीए को सीएलआर समर्थन को सक्षम करने के लिए सहमत होना है, और आपको उन्हें एक संकलित .NET assmebly http://msdn.microsoft.com/en-us/library/ms254498(VS.80).aspx के रूप में तैनात करना होगा – Andomar

5

आप अपनी सभी तालिकाओं को यूनियन कर सकते हैं और तालिका नाम को कॉलम के रूप में शामिल कर सकते हैं, फिर तालिका नाम को इस पर भविष्यवाणी के रूप में निर्दिष्ट करें। यदि आप इस उदाहरण के लिए क्वेरी प्लान की जांच करते हैं तो आप देखते हैं कि टी 2

create table t1 (i int) 
create table t2 (i int) 

insert t1 values(1) 
insert t1 values(2) 
insert t1 values(3) 
insert t2 values(4) 
insert t2 values(5) 
insert t2 values(6) 


;with tableSet as (
    select i, 't1' as tableName from t1 
    union all select i, 't2' as tableName from t2 
) 
select i from tableSet where tableName = 't1' 
+0

+1 प्रश्न में "बड़े स्विच स्टेटमेंट" दृष्टिकोण को – Andomar

+0

@Andomar से बाहर रखा गया है, मैंने सोचा था कि यह/अन्य ब्लॉक के गुच्छा से थोड़ा कम "स्विची" था। जैसे यूनियन को टेबल के इस सेट को सभी को एक दृश्य में लपेटा जा सकता है यदि आपके पास कार्यक्षमता की आवश्यकता वाले कई फ़ंक्शन थे, जिन्हें आप/else के साथ नहीं कर सके। प्वाइंट लिया गया हालांकि;) – ahains

0

आप इसे नहीं कर सकते हैं। आप क्या समस्या हल कर रहे हैं, अन्य समाधान भी हो सकते हैं।

21
SET @SQL = 'SELECT * FROM ' + @table 
EXEC (@SQL) -- parentheses are required 
+2

यह जानकर अच्छा लगा कि इसे नकारात्मक वोट क्यों मिला .... – johnnycrash

+0

आपको नकारात्मक वोट मिल सकता है क्योंकि इससे आप इस क्वेरी का उपयोग करने के तरीके के आधार पर SQL इंजेक्शन हमले के लिए खुल जाते हैं। संपादित करें: मैंने अभी देखा है कि डेवके ने कहा कि वह इस सवाल में ऐसा नहीं कर सकता - शायद यह है कि आपका डाउनवोट कहाँ से आया था। –

0

यदि आप अंतर्निहित समस्या के बारे में अधिक जानकारी देंगे जो आप हल करने की कोशिश कर रहे हैं, तो हमारे पास बेहतर जवाब हो सकते हैं। एक समाधान कोड के आधार पर यूडीएफ उत्पन्न करने के लिए कोड है। एक एसपी से गतिशील एसक्यूएल का उपयोग करना है। आपकी स्थिति के लिए क्या कहना सही है।