2011-02-03 6 views
6

क्या SQL सर्वर में संग्रहीत प्रक्रिया के भीतर उनके इंडेक्स द्वारा कॉलम तक पहुंचने का कोई तरीका है?एसक्यूएल सर्वर संग्रहीत प्रक्रिया में नाम के बजाय इंडेक्स द्वारा तालिका के एक्सेस कॉलम

उद्देश्य कई स्तंभों की गणना करना है। मैं कर्सर के बारे में पढ़ रहा था, लेकिन मुझे नहीं पता कि उन्हें कैसे लागू किया जाए।

field_1 field_2 field_3 field_4 ...field_d Sfield_1 Sfield_2 Sfield_3...Sfield_n 
1  2  3  4   d  10  20  30   n 

मैं की तरह (field_1*field1) - (Sfield_1* Sfiled_1)/more...

तो परिणाम एक तालिका स्तंभ d बार में संग्रहित है कुछ की गणना करने की जरूरत है:

मैं की तरह एक पंक्ति है:

मुझे मेरी समस्या के बारे में बताएं।

तो परिणाम d column * d row तालिका है।

कॉलम की संख्या परिवर्तनीय है, इसलिए मैं गतिशील एसक्यूएल बनाने, स्ट्रिंग में कॉलम के नाम प्राप्त करने और मुझे आवश्यकतानुसार विभाजित करने पर विचार कर रहा था, लेकिन यह दृष्टिकोण समस्या को कठिन बनाता है। मैंने सोचा कि इंडेक्स द्वारा कॉलम नंबर प्राप्त करना जीवन को आसान बना सकता है।

+1

संभावित डुप्लिकेट (http://stackoverflow.com/questions/368505/is-it-possible-to-select-sql-server- डेटा-उपयोग-कॉलम-ऑर्डिनल-स्थिति) –

उत्तर

3

सबसे पहले, OMG Ponies ने कहा, आप कॉलम को उनके सामान्य स्थिति से संदर्भित नहीं कर सकते हैं। यह दुर्घटना नहीं है। एसक्यूएल विनिर्देश डीडीएल या डीएमएल में गतिशील स्कीमा के लिए नहीं बनाया गया है।

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

हालांकि, हो सकता है कि के रूप में यह, यह देखते हुए हो सकता है कि तुम क्या हमें बताया है, एक वैकल्पिक समाधान निम्नलिखित की तरह कुछ होगा: (मैं यह सोचते हैं रहा है कि field_1*field1 या Power(field_1, 2)field_1 * field_1 होना चाहिए था या field_1 चुकता)

Select 1 As Sequence, field_1 As [Field], Sfield_1 As [SField], Sfiled_1 As [SFiled] 
Union All Select 2, field_2, Sfield_2, Sfiled_2 
... 
Union All Select n, field_n, Sfield_n, Sfiled_n 

अब आपकी क्वेरी लगता है:

With Inputs As 
    (
    Select 1 As Sequence, field_1 As [Field], Sfield_1 As [SField], Sfiled_1 As [SFiled] 
    Union All Select 2, field_2, Sfield_2, Sfiled_2 
    .... 
    ) 
    , Results As 
    (
    Select Case 
      When Sequence = 1 Then Power([Field], 2) - ([SField] * [SFiled]) 
      Else 1/Power([Field], 2) - ([SField] * [SFiled]) 
      End 
      As Result 
    From Inputs 
    ) 
Select Exp(Sum(Log(Result))) 
From Results 
+0

धन्यवाद, मेरे पास एक टेबल है जिस तरह से यह एक लंबी क्वेरी द्वारा उत्पन्न किया गया था जो डी * एन कॉलम के साथ एक पंक्ति देता है, अब मुझे कुछ कॉलम लेना है और कुछ ऑपरेशन करना है, मैं आपके द्वारा प्रदान किए गए कोड का उपयोग कैसे करूं मेरी स्टोर प्रक्रिया ?, जैसा कि अधिक फ़ील्ड_एक्स है ... मैं गतिशील एसक्यूएल में ट्रिंक कर रहा हूं ... @template = अनुक्रम, फ़ील्ड_1 के रूप में [फ़ील्ड], फ़ील्ड_2 एएस [फील्ड 2], ..., field_d AS [Fieldd] , Sfield_1 के रूप में [SField], Sfied_2 के रूप में [SField_2], ..., Sfield_n [SField_n] के रूप में, एक स्ट्रिंग में, और फिर आपके द्वारा प्रदत्त कोड में गतिशील रूप से प्रतिस्थापित करें। मैं यह कैसे कर सकता हूं ?, क्या आप मुझे समझा सकते हैं, थोड़ा कोड? धन्यवाद – cMinor

+0

@darkcminor - सबसे पहले, मैं डी * एन कॉलम के साथ लंबी क्वेरी के स्रोत को देखता हूं और देखता हूं कि कच्चे डेटा को इस तरह से संरचित किया गया है या नहीं। शायद इसे सामान्यीकृत संरचना से इस तरह इकट्ठा किया जा रहा है। यदि वह मामला था, तो स्पष्ट रूप से सामान्यीकृत संरचना का उपयोग करना आसान होगा। दूसरा, समाधान की कुंजी 'संघीय सभी' क्वेरी है। कॉलम की सूची प्रति 'एन' में एक चयन कथन में विभाजित करें और एक अनुक्रम जोड़ें। इस प्रकार, जो आपने अपनी पोस्ट में प्रस्तुत किया है, मैं संघीय सभी क्वेरी में स्ट्रिंग को पार्स करने के लिए टी-एसक्यूएल के अलावा कुछ और उपयोग करूंगा। एक बार आपके पास हो जाने के बाद, क्वेरी आसान होनी चाहिए। – Thomas

6

नहीं, आप SELECT खंड में क्रमिक (संख्यात्मक) स्थिति का उपयोग नहीं कर सकते हैं।

केवल ORDER BY खंड में आप सामान्य स्थिति का उपयोग कर सकते हैं, क्योंकि यह SELECT खंड में निर्दिष्ट कॉलम (ओं) पर आधारित है।

+0

समस्या को हल करने के लिए अपमान कैसे होगा? – cMinor

+0

@darkcminor: नाम से कॉलम का संदर्भ लें। यदि आप चाहें तो कॉलम नामों की सूची प्राप्त करने के लिए डायनामिक एसक्यूएल का उपयोग करें, लेकिन कॉलम ऑर्डर किसी डेटाबेस के लिए अप्रासंगिक है। मैं यह उल्लेख करना भूल गया कि कुछ डेटाबेस ग्रुप बाय और हैविंग में ऑर्डिनल का समर्थन करते हैं। दूसरा विकल्प आपकी आवश्यकताओं का समर्थन करने के लिए कॉलम को फिर से डिजाइन करना है। –

+0

मैं कोशिश की है का चयन करें @column \t = COALESCE (@ स्तंभ + ',' ',') \t \t \t \t \t \t \t + स्तंभ INFORMATION_SCHEMA.COLUMNS \t से जहां (TABLE_NAME = 'अस्थायी') है कि मुझे नाम से अलग कर दिया देता है ',' लेकिन जैसा कि मैंने कहा, विभाजन और कई स्तंभों के मूल्य प्राप्त करना मुश्किल हो रहा है, पिवट या ऐसा कुछ उपयोग करने के लिए संभव हो सकता है? – cMinor

0

यह सबसे सुरुचिपूर्ण या कुशल नहीं हो सकता है, लेकिन यह काम करता है। मैं डेटा के बीच तेज़ मैपिंग के लिए एक नई टेबल बनाने के लिए इसका उपयोग कर रहा हूं जिसे मुझे सभी कॉलम/पंक्तियों के माध्यम से पार्स करने की आवश्यकता है।

DECLARE @sqlCommand varchar(1000) 
DECLARE @columnNames TABLE (colName varchar(64), colIndex int) 
DECLARE @TableName varchar(64) = 'YOURTABLE' --Table Name 
DECLARE @rowNumber int = 2 -- y axis 
DECLARE @colNumber int = 24 -- x axis 

DECLARE @myColumnToOrderBy varchar(64) = 'ID' --use primary key 

--Store column names in a temp table 
INSERT INTO @columnNames (colName, colIndex) 
SELECT COL.name AS ColumnName, ROW_NUMBER() OVER (ORDER BY (SELECT 1)) 
    FROM sys.tables AS TAB 
    INNER JOIN sys.columns AS COL ON COL.object_id = TAB.object_id 
    WHERE TAB.name = @TableName 
    ORDER BY COL.column_id; 

DECLARE @colName varchar(64) 
SELECT @colName = colName FROM @columnNames WHERE colIndex = @colNumber 

--Create Dynamic Query to retrieve the x,y coordinates from table 
SET @sqlCommand = 'SELECT ' + @colName + ' FROM (SELECT ' + @colName + ', ROW_NUMBER() OVER (ORDER BY ' + @myColumnToOrderBy+ ') AS RowNum FROM ' + @tableName + ') t2 WHERE RowNum = ' + CAST(@rowNumber AS varchar(5)) 
EXEC(@sqlCommand) 
की [यह संभव स्तंभ क्रमसूचक स्थिति का उपयोग एसक्यूएल सर्वर डेटा का चयन करने है]
संबंधित मुद्दे