मुझे लगता है कि आप वहां आधा रास्ते हैं। बस मार्टिन के रूप में UNPIVOT
और dynamic SQL
का उपयोग की सिफारिश की:
CREATE TABLE TableA (
Code VARCHAR(10),
Name VARCHAR(10),
Details VARCHAR(10)
)
INSERT TableA VALUES ('Foo', 'Bar', 'Baz')
GO
DECLARE @sql nvarchar(max)
SET @sql = (SELECT STUFF((SELECT ',' + column_name
FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_name='TableA'
ORDER BY ordinal_position FOR XML PATH('')), 1, 1, ''))
SET @sql = N'SELECT [Key], Val FROM (SELECT ' + @sql + ' FROM TableA) x '
+ 'UNPIVOT (Val FOR [Key] IN (' + @sql + ')) AS unpiv'
EXEC (@sql)
परिणाम:
Key Val
------------ ------------
Code Foo
Name Bar
Details Baz
वहाँ एक चेतावनी है निश्चित रूप से। उपर्युक्त कोड के लिए काम करने के लिए आपके सभी कॉलमों को एक ही डेटा प्रकार होना आवश्यक होगा। यदि वे नहीं हैं, तो आपको यह त्रुटि मिल जाएगी:
Msg 8167, Level 16, State 1, Line 1
The type of column "Col" conflicts with the type of
other columns specified in the UNPIVOT list.
इसके आसपास जाने के लिए, आपको दो कॉलम स्ट्रिंग स्टेटमेंट बनाने होंगे। एक कॉलम प्राप्त करने के लिए और एक को अपने वैल कॉलम के लिए डेटा प्रकार के रूप में सभी को कास्ट करने के लिए।
कई कॉलम प्रकार के लिए:
CREATE TABLE TableA (
Code INT,
Name VARCHAR(10),
Details VARCHAR(10)
)
INSERT TableA VALUES (1, 'Foo', 'Baf')
GO
DECLARE
@sql nvarchar(max),
@cols nvarchar(max),
@conv nvarchar(max)
SET @cols = (SELECT STUFF((SELECT ',' + column_name
FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_name='TableA'
ORDER BY ordinal_position FOR XML PATH('')), 1, 1, ''))
SET @conv = (SELECT STUFF((SELECT ', CONVERT(VARCHAR(50), '
+ column_name + ') AS ' + column_name
FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_name='TableA'
ORDER BY ordinal_position FOR XML PATH('')), 1, 1, ''))
SET @sql = N'SELECT [Key], Val FROM (SELECT ' + @conv + ' FROM TableA) x '
+ 'UNPIVOT (Val FOR [Key] IN (' + @cols + ')) AS unpiv'
EXEC (@sql)
यह एक 'UNPIVOT' नहीं एक' PIVOT' है लेकिन आप अभी भी गतिशील एसक्यूएल की आवश्यकता होगी। मार्टिन की टिप्पणी के लिए –
+1। जैसा कि आप अनपढ़ किए गए कॉलम नहीं जानते हैं, आपको डायनामिक एसक्यूएल की आवश्यकता है। – MatBailie
@Aaron - बस एक टाइपो, अब तय – kateroh