2008-12-15 4 views
29

का उपयोग कर एसक्यूएल सर्वर डेटा का चयन करना संभव है क्या तालिका कॉलम के लिए ordinal_position का उपयोग करके कॉलम डेटा का चयन करना संभव है? मुझे पता है कि औपचारिक स्थितियों का उपयोग करना एक बुरा अभ्यास है, लेकिन एक बंद डेटा आयात प्रक्रिया के लिए मुझे कॉलम डेटा प्राप्त करने के लिए क्रमिक स्थिति का उपयोग करने में सक्षम होना चाहिए।कॉलम ऑर्डिनल स्थिति

इसलिए उदाहरण

create table Test(
    Col1 int, 
    Col2 nvarchar(10) 

) 

के बजाय प्रयोग करने के लिए

select Col2 from Test 

मैं लिख सकते हैं

select "2" from Test -- for illustration purposes only 
+0

धन्यवाद समय देने के लिए मेरे सवालों का जवाब के लिए हर किसी को। ऐसा लगता है कि मैं जो करने की कोशिश कर रहा हूं वह नहीं किया जा सकता है। – rams

+0

चूहों। मैं बस यही सवाल लिख रहा था। – MusiGenesis

+0

महान सवाल। मैं बस सोच रहा था कि यह आज संभव था या नहीं। – VISQL

उत्तर

2

हाँ, आप सिस्टम तालिकाओं में वास्तव में कुछ बदसूरत हिट के साथ ऐसा कर सकता है। आपको शायद गतिशील एसक्यूएल की दुनिया में गिरने की आवश्यकता होगी।

मैं वास्तव में, वास्तव में इस दृष्टिकोण की अनुशंसा नहीं करता हूं।

है कि आप रोकते नहीं किया है, तो यह आप आरंभ हो सकता है (ref):

select table_name, column_name, ordinal_position, data_type 
from information_schema.columns 
order by 1,3 
1

नहीं, आप उनके क्रमसूचक स्थिति के आधार पर स्तंभों का चयन नहीं कर सकते हैं, के रूप में तक मुझे पता है।

ट्रांजैक्ट एसक्यूएल संदर्भ को देखते समय, सुझाव देने के लिए कुछ भी नहीं है कि आप (http://msdn.microsoft.com/en-us/library/ms176104(SQL.90).aspx) कर सकते हैं।

4

आप स्तंभों की क्रमसूचक पदों प्राप्त करने के लिए इस क्वेरी

select * from information_schema.columns 

उपयोग कर सकते हैं। माइकल हैरन की तरह लिखा है, आपको इसका उपयोग करके गतिशील क्वेरी बनाना होगा, या तो कोड में या उस स्प्रोक में जिसे आप कॉलम पोजीशन पास करते हैं।

एफडब्ल्यूआईडब्ल्यू, यह शुद्ध बुराई है।

इसके अलावा, मृत्युफलक सही है, आप वास्तव में ऐसा नहीं कर सकते हैं, क्योंकि आप स्थिति के आधार पर एक नियमित क्वेरी w/कॉलम नाम बनायेंगे।

+3

"शुद्ध बुराई" टिप्पणी को प्यार किया :) –

0

मुझे नहीं लगता कि आप कर सकते हैं। जैसा कि @ माइकल हैरन ने दिखाया है, आप खंडों द्वारा ऑर्डर में ऑर्डिनल पोजिशन का उपयोग कर सकते हैं लेकिन मैंने कभी उन्हें SQL सर्वर में कहीं और नहीं देखा है।

मुझे यकीन नहीं है कि आप अपने एक-ऑफ डेटा आयात के साथ किस समस्या का सामना कर रहे हैं, इससे मदद मिलेगी - संभवतः कुछ दुर्भाग्यपूर्ण कॉलम नाम? क्या आप थोड़ा और समझा सकते हैं?

+0

@robsoft - मैं एक डीबी के साथ काम कर रहा हूं जो मैपिंग जानकारी का उपयोग करता है। कर्नल नाम मैपिंग टेबल में संग्रहीत हैं। एक बड़ी केस स्टेटमेंट के साथ एक proc आयात चलाता है और मैं इसे सुधारने की कोशिश कर रहा हूं। गतिशील एसक्यूएल का उपयोग प्रक्रिया को तेज नहीं किया था। – rams

+0

आह, मैं देखता हूं। यह काफी दिलचस्प समस्या है! मुझे आश्चर्य है कि क्या यह गतिशील रूप से दृश्य बनाकर किया जा सकता है? इच्छा है कि मेरे साथ खेलने के लिए अभी कुछ हाथ था! :-) – robsoft

13

आप की तरह

declare @col1 as varchar(128) 
declare @col2 as varchar(128) 
declare @sq1 as varchar(8000) 

select @col1 = column_name from information_schema.columns where table_name = 'tablename' 
and ordinal_position = @position 

select @col2 = column_name from information_schema.columns where table_name = 'tablename' 
and ordinal_position = @position2 

set @sql = 'select ' + col1 ',' + col2 'from tablename' 

exec(@sql) 
+0

धन्यवाद। मेरा पहला प्रयास गतिशील एसक्यूएल का उपयोग कर रहा था जो वास्तव में मेरी प्रो के विपरीत मेरी प्रो को धीमा कर देता था जिसने मुझे आश्चर्यचकित कर दिया कि क्या मैं कॉलम ऑर्डिनल स्थिति जानकारी का किसी भी तरह से उपयोग कर सकता हूं। – rams

+0

ठीक है, मैं बस इतना सोच सकता हूं। –

0

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

संपादित करें: मुझे लगता है कि आपने किसी अन्य टिप्पणी में कुछ डिग्री के लिए इसका उत्तर दिया है। क्या आप अधिक विशिष्टता प्रदान कर सकते हैं? आयात proc और/या तालिका परिभाषाएं?

-5

यदि आप एमएस एसक्यूएल 2005 का उपयोग कर रहे हैं तो आप ROW_NUMBER फ़ंक्शन का उपयोग कर सकते हैं।

चयन Col1, Col2, ROW_NUMBER() से अधिक (Col1 द्वारा आदेश) टेस्ट से कहां ROW_NUMBER() से अधिक (Col1 द्वारा आदेश) @Position के बीच और @Position

यही चाहिए पाने के आप इच्छित परिणाम अगर मैं सवाल सही ढंग से पढ़ रहा हूं।

1

आप स्तंभों की संख्या पता है, एक तरह से स्तंभों की है कि संख्या के साथ एक tmp तालिका में डेटा हस्तांतरण और अस्थायी तालिका से चयन करने के लिए हो सकता है ...

declare @tmp table(field1 sql_variant, field2 int, field3 sql_variant) 

insert into @tmp 
select * from Test 

select field2 from @tmp 
8

आप की मात्रा पता है कॉलम है, लेकिन इसके नाम और प्रकार पता नहीं, आप चाल निम्न का उपयोग कर सकते हैं:

select NULL as C1, NULL as C2 where 1 = 0 
-- Returns empty table with predefined column names 
union all 
select * from Test 
-- There should be exactly 2 columns, but names and data type doesn't matter 

नतीजतन, आप 2 कॉलम [सी 1] और [सी 2] के साथ एक मेज होगा। यदि आपके टेबल में 100 कॉलम हैं, तो यह विधि बहुत उपयोगी नहीं है, लेकिन यह छोटे पूर्वनिर्धारित कॉलम वाले टेबल के लिए अच्छी तरह से काम करती है।

+0

यह एक अच्छी चाल है, लेकिन निष्पादन योजना के साथ क्या होता है? मान लें कि मेरी टेबल में लाखों पंक्तियां हैं, और कहें कि मैं 'शीर्ष 1000' चुनना चाहता हूं। क्या यह चाल अभी भी सर्वर को इंडेक्स का उपयोग करने देगी? –

0

आपके पास एक विकल्प शर्तों का उपयोग किया जाता है: अपने उदाहरण में:

SELECT 
    CASE YourColumnNumber 
     WHEN "1" THEN Col1 
     WHEN "2" THEN Col2 
     ELSE "?" 
    END AS Result 
    FROM Test 

स्कीमा के लिए जा रहे क्वेरी मुझे डर लग रहा धीमी हो जाएगी ...

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