Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

डायनामिक SQL सर्वर पिवट (UNPIVOT) कॉलम का नाम एक पंक्ति मान के लिए

तो आपको कुछ समस्याएं हैं ... पहला यह है कि इसके लिए गतिशील एसक्यूएल की आवश्यकता होती है क्योंकि तालिका और कॉलम समय से पहले ज्ञात नहीं होते हैं, इसलिए आप केवल एक साधारण अनपिवट का उपयोग नहीं कर सकते हैं।

इसका मतलब यह भी है कि आपको सिस्टम टेबल से कॉलम नाम प्राप्त करने होंगे।

आपकी दूसरी समस्या यह है कि आपके सभी डेटाटाइप अज्ञात हैं इसलिए आपको सभी कॉलम को किसी ऐसी चीज़ पर डालना होगा जो सब कुछ और किसी भी लम्बाई का समर्थन कर सके... varchar(max).

तो, उन दो बाधाओं को ध्यान में रखते हुए यहाँ एक समाधान है:

declare @yourTable varchar(50)
declare @yourKeyField varchar(50)
declare @yourKey varchar(50)

set @yourTable = 'MyTable' /** change to tablename or pass as parameter */
set @yourKeyField = 'ID'   /** change to fieldname or pass as parameter */
set @yourKey = '5'         /** change to key value or pass as parameter */

declare @query nvarchar(max)  

select @query = COALESCE(@query+' union all ','') + 'select ''' + c.name + ''' as
[Column], Cast([' + c.name + '] AS VarChar(MAX)) as [Value] from ' + @yourTable + ' 
where ' + @yourKeyField + ' = ''' + @yourKey + '''' from syscolumns c 
    inner join sysobjects o on c.id = o.id and o.xtype = 'u'
    where o.name = @yourTable order by c.colid

exec sp_executesql @query /** execute query */

अंत में, मैं अच्छे विवेक में ऐसे समाधान की अनुशंसा नहीं कर सकता जो गतिशील एसक्यूएल का उपयोग करता है, इसमें शामिल खतरों की चेतावनी के बिना (प्रदर्शन के दृष्टिकोण और इंजेक्शन की संभावना दोनों से)। यदि आप इस विषय पर अपना ज्ञान बढ़ाना चाहते हैं तो इस उत्कृष्ट लेख को पढ़ें।

http://www.sommarskog.se/dynamic_sql.html




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL सर्वर में वर्चर (अधिकतम) के लिए NULL मान वापस क्यों नहीं कर रहा है?

  2. मैं कम से कम समय में 10 मिलियन रिकॉर्ड कैसे सम्मिलित कर सकता हूं?

  3. मैं विंडोज़ रजिस्ट्री से एसक्यूएल सर्वर पोर्ट नंबर कैसे ढूंढ सकता हूं?

  4. टीएसक्यूएल:तालिका में स्ट्रिंग का नेस्टेड स्प्लिट/पार्स (एकाधिक समेकित टैग:एक स्ट्रिंग में मान)

  5. sys.dm_os_host_info गतिशील प्रबंधन दृश्य के साथ SQL सर्वर में ऑपरेटिंग सिस्टम संस्करण जानकारी लौटाएं