मैं गतिशील रूप से अन्य स्तंभ कैसे कर सकता हूं?


10

मेरे पास एक टेबल है (मेरे द्वारा डिजाइन नहीं) जिसमें 20 वैरिएबल नाम वाले कॉलम हैं। यही है, आप किस प्रकार के रिकॉर्ड को देख रहे हैं, इसके आधार पर, कॉलम का लागू नाम बदल सकता है।

संभव स्तंभ नाम किसी अन्य तालिका में संग्रहीत किए जाते हैं, जिसे मैं बहुत आसानी से क्वेरी कर सकता हूं।

इसलिए, जिस क्वेरी की मैं वास्तव में तलाश कर रहा हूं वह कुछ इस तरह है:

SELECT Col1 AS (SELECT ColName FROM Names WHERE ColNum = 1 and Type = @Type),
       Col2 AS (SELECT ColName FROM Names WHERE ColNum = 2 and Type = @Type)
FROM   Tbl1 
WHERE  Type = @Type

जाहिर है कि काम नहीं करता है, तो मैं एक समान परिणाम कैसे प्राप्त कर सकता हूं?

' मैंने एक क्वेरी स्ट्रिंग बनाने की कोशिश की है और EXECUTEइसे इंगेज किया है, लेकिन यह सिर्फ "कमांड (एस) को सफलतापूर्वक पूरा करता है" और एक रोसेट वापस करने के लिए प्रतीत नहीं होता है। यह पता चलता है कि मैं गतिशील SQL बनाने के लिए एक गलत क्वेरी का उपयोग कर रहा था और जैसे कि एक खाली स्ट्रिंग का निर्माण किया। SQL सर्वर निश्चित रूप से खाली स्ट्रिंग को सही तरीके से निष्पादित करता है।

ध्यान दें कि स्तंभ नामों को केवल कठिन कोड करने के बजाय मुझे ऐसा करने की आवश्यकता है, यह है कि स्तंभ नाम उपयोगकर्ता कॉन्फ़िगर करने योग्य हैं।


1
यदि आप क्वेरी स्ट्रिंग को प्रिंट करते हैं, तो एक नई क्वेरी विंडो में कॉपी / पेस्ट करें और वहां निष्पादित करें तो क्या होगा?
22

"उपयोगकर्ता विन्यास" का अर्थ है कि सैकड़ों या हजारों प्रकार हैं, और / या उपनाम अक्सर बदलते रहते हैं? यदि उपनाम काफी स्थिर हैं, तो मैं दृश्यों की एक श्रृंखला बनाने की सलाह दूंगा।
जॉन ऑफ ऑल ट्रेड्स

@DenisT, यह कुछ भी आउटपुट नहीं करता है, जो शायद इंगित करता है कि कुछ और गलत है। लीड के लिए धन्यवाद।
23

@JonofAllTrades दुर्भाग्य से, जब वे काफी स्थिर होते हैं, तो यह अनुमान का बहुत हिस्सा है कि जब उपयोगकर्ता सॉफ़्टवेयर में कुछ बदलता है, तो उस चीज़ को रिपोर्ट में भी बदलना होगा।
हॉटशीप्स

@DenisT यह पता चलता है कि गतिशील एसक्यूएल के निर्माण के लिए उपयोग की जाने वाली मेरी उपश्रेणियाँ गलत थीं और अशक्त सेट लौटा दी गईं। इसलिए SQL सर्वर ने एक खाली क्वेरी लौटा दी, जिसे उसने सफलतापूर्वक निष्पादित किया। प्रिंट कमांड को इंगित करने के लिए धन्यवाद।
हॉटशीप्स

जवाबों:


12

निम्नलिखित कोड का प्रयास करें:

CREATE TABLE #Names
(
    [Type] VARCHAR(50),
    ColNum SMALLINT,
    ColName VARCHAR(50),
    ColDataType VARCHAR(20)
)

INSERT  INTO #Names VALUES
('Customer', 1, 'CustomerID', 'INT'),
('Customer', 2, 'CustomerName', 'VARCHAR(50)'),
('Customer', 3, 'CustomerJoinDate', 'DATE'),
('Customer', 4, 'CustomerBirthDate', 'DATE'),
('Account', 1, 'AccountID', 'INT'),
('Account', 2, 'AccountName', 'VARCHAR(50)'),
('Account', 3, 'AccountOpenDate', 'DATE'),
('CustomerAccount', 1, 'CustomerID', 'INT'),
('CustomerAccount', 2, 'AccountID', 'INT'),
('CustomerAccount', 3, 'RelationshipSequence', 'TINYINT')


CREATE TABLE #Data
(
    [Type] VARCHAR(50),
    Col1 VARCHAR(50),
    Col2 VARCHAR(50),
    Col3 VARCHAR(50),
    Col4 VARCHAR(50),
    Col5 VARCHAR(50),
    Col6 VARCHAR(50),
    Col7 VARCHAR(50)
)

INSERT  INTO #Data VALUES
('Customer', '1', 'Mr John Smith', '2005-05-20', '1980-11-15', NULL, NULL, NULL),
('Customer', '2', 'Mrs Hayley Jones', '2009-10-10', '1973-04-03', NULL, NULL, NULL),
('Customer', '3', 'ACME Manufacturing Ltd', '2012-12-01', NULL, NULL, NULL, NULL),
('Customer', '4', 'Mr Michael Crocker', '2014-01-13', '1957-01-23', NULL, NULL, NULL),
('Account', '1', 'Smith-Jones Cheque Acct', '2005-05-25', NULL, NULL, NULL, NULL),
('Account', '2', 'ACME Business Acct', '2012-12-01', NULL, NULL, NULL, NULL),
('Account', '3', 'ACME Social Club', '2013-02-10', NULL, NULL, NULL, NULL),
('Account', '4', 'Crocker Tipping Fund', '2014-01-14', NULL, NULL, NULL, NULL),
('CustomerAccount', '1', '1', '1', NULL, NULL, NULL, NULL),
('CustomerAccount', '2', '1', '2', NULL, NULL, NULL, NULL),
('CustomerAccount', '2', '3', '2', NULL, NULL, NULL, NULL),
('CustomerAccount', '3', '2', '1', NULL, NULL, NULL, NULL),
('CustomerAccount', '3', '3', '1', NULL, NULL, NULL, NULL),
('CustomerAccount', '4', '2', '2', NULL, NULL, NULL, NULL),
('CustomerAccount', '4', '4', '1', NULL, NULL, NULL, NULL)


DECLARE @Type VARCHAR(50) = 'Account' -- Or Customer, or CustomerAccount

DECLARE @SQLText NVARCHAR(MAX) = ''

SELECT  @SQLText += 'SELECT '

SELECT  @SQLText += ( -- Add in column list, with dynamic column names.
                SELECT  'CONVERT(' + ColDataType + ', Col' + CONVERT(VARCHAR, ColNum) + ') AS [' + ColName + '],'
                FROM    #Names
                WHERE   [Type] = @Type FOR XML PATH('')
            )

SELECT  @SQLText = LEFT(@SQLText, LEN(@SQLText) - 1) + ' ' -- Remove trailing comma

SELECT  @SQLText += 'FROM #Data WHERE [Type] = ''' + @Type + ''''

PRINT   @SQLText
EXEC    sp_executesql @SQLText

यह सेलेक्ट स्टेटमेंट लौटाता है: SELECT CONVERT(INT, Col1) AS [AccountID],CONVERT(VARCHAR(50), Col2) AS [AccountName],CONVERT(DATE, Col3) AS [AccountOpenDate] FROM #Data WHERE [Type] = 'Account'


डायनेमिक एसक्यूएल का उपयोग करना सही उत्तर है, यह देखते हुए कि प्रश्न एसक्यूएल के साथ कैसे करना है। यह भी कुछ ऐसा था जिसे मैंने करने की कोशिश की, लेकिन गलत तरीके से।
हॉटचिप्स

ध्यान रखें कि यदि आप उपयोगकर्ता इनपुट को स्वीकार करने और इसे का उपयोग गतिशील एसक्यूएल का निर्माण करने की कर रहे हैं, तो आप वास्तव में, में भालू वास्तव में एसक्यूएल इंजेक्शन और sanitizing आदानों के बारे में चिंतित होने की जरूरत। bobby-tables.com
जोनाथन वान

@JonathanVanMatre बिल्कुल। सौभाग्य से, यह केवल आंतरिक उपयोग के लिए है, और सभी इनपुट पहले से ही ऐप द्वारा स्वीकृत हैं।
हॉटचिप्स

7

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

जबकि एक शुद्ध SQL मेथड संभव हो सकता है यह गतिशील SQL होगा और कोड मेनटेनेंस एक बुरा सपना होगा।

इसके अलावा, शायद आपके लिए देख रहे हैं sp_executesqlऔर नहीं बस के EXECUTE N'Query String'रूप में अपने आदेश के मुद्दे को सफलतापूर्वक पूरा कर सकते हैं।


मैं सहमत हूं, और मैं निश्चित रूप से SSRS में ऐसा कर सकता हूं, लेकिन मैं इस समय मेरे द्वारा उपयोग किए जा रहे अन्य रिपोर्टिंग सॉफ़्टवेयर में नहीं कर सकता।
हॉटचिप्स 23
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.