2011-12-09 19 views
5

मैं एक SQL क्वेरी निष्पादित करने का प्रयास कर रहा हूं जो तालिका में पहले रिकॉर्डसेट से टेक्स्ट के साथ तालिका के कॉलम का नाम बदल देगा।किसी तालिका तालिका के फ़ील्ड मानों के साथ SQL तालिका के कॉलम का नाम बदलें

मेरे तालिका इस प्रकार है:

COL1 | COL2 | COL3 | COL4 | COL5 | COL6 

REASON |ITEMDATE|ITEMTIME|SITENAME| EVENT | RPM 
tstamp |12-11-07| 24:12 | Spain1 |Shutdwn | 1000 
tstamp |13-11-07| 02:22 | Spain1 |Startup | 1050 

और मैं इस तरह कॉलम का नाम बदलने के लिए करना चाहते हैं:

REASON |ITEMDATE|ITEMTIME|SITENAME| EVENT | RPM 

tstamp |12-11-07| 24:12 | Spain1 |Shutdwn | 1000 
tstamp |13-11-07| 02:22 | Spain1 |Startup | 1050 

उत्तर

4

यह प्रक्रिया आपको जो चाहिए वह करेगा।

exec p_rename_columns N'<mytable>' 

नोट प्रक्रिया मानता है कि कि "पहली" पंक्ति डिस्क पर शारीरिक पहली पंक्ति है: इस प्रकार आप इसे चला सकते हैं। चूंकि यह तालिका के आधार पर क्लस्टर इंडेक्स का उपयोग करने वाले क्षेत्र के आधार पर बदल सकता है, यह 100% गारंटीकृत नहीं है।

प्रक्रिया के लिए कोड:

create proc p_rename_columns (@table sysname) 
AS 

declare @name sysname, 
     @col sysname, 
     @sql nvarchar(max) 

declare cur cursor 
local read_only 
for select name 
     from sys.columns 
    where object_id = object_id(@table) 

open cur 
fetch next from cur into @name 

while @@fetch_status = 0 
    begin 

    select @sql = N'select top (1) @col = ' + quotename(@name) + N' from ' + quotename(@table) 
    exec sp_executesql @sql, N'@col sysname output', @col output 

    select @sql = N'exec sp_rename ''' + quotename(@table) + N'.' + quotename(@name) + N''', ''' + @col + N'''' 
    exec (@sql) 

    fetch next from cur into @name 
    end 
close cur 
deallocate cur 

select @sql = N'DELETE TOP (1) from ' + quotename(@table) 
exec (@sql) 
GO 
+0

बिल्कुल सही, इसके लिए आपको बहुत कुछ धन्यवाद, जो मुझे चाहिए !! – neilrudds

+0

मैंने कुछ गायब कोनेनाम() कॉल जोड़े। –

2

शुद्ध एसक्यूएल में कोई आसान तरीका नहीं है, मुख्य विकल्प एक निर्माण करने के लिए कर रहे हैं गतिशील एसक्यूएल क्वेरी या सिर्फ एक एकल परिणाम सेट लौटाएं और अपनी प्रेजेंटेशन लेयर को इसे संभालें।

लेकिन, बड़ा सवाल यह है कि आप एक ही तालिका में डेटा और मेटाडेटा क्यों मिला रहे हैं? यदि एक पंक्ति में स्तंभ नाम हैं और बाकी सब कुछ डेटा है, तो बस सही कॉलम नामों के साथ एक तालिका बनाएं और इसमें डेटा लोड करें। चूंकि आप एक CSV फ़ाइल लोड कर रहे हैं, इसलिए आप अपने लिए अधिकांश काम करने के लिए use SSIS कर सकते हैं।

+0

समस्या यह है कि टेबल डायनामिक रूप से तैयार किया जाना है, एक फ़ोल्डर में कई CSV फ़ाइलों देखते हैं की जरूरत है और प्रत्येक फ़ाइल हेडर का एक अलग सेट (समान और कोई समान है)। अंतिम लक्ष्य इन सभी सीएसवी फ़ाइलों से डेटा को एक फ़ोल्डर में पुनर्प्राप्त करना है और उन्हें एक तालिका में जोड़ना है। – neilrudds

+0

एसएसआईएस हमेशा उपलब्ध नहीं है (उदाहरण के लिए एसक्यूएल सर्वर एक्सप्रेस) –

+0

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

0

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

मैं एक सरल समाधान का प्रस्ताव:

  1. आप केवल एक बार करना चाहते हैं, और अपने टेबल से अधिक नहीं कहना 10 या 20 टेबल कर रहे हैं, बस एक नया डेटाबेस में हाथ से उन्हें बनाने, और उसके बाद नई तालिकाओं को पॉप्युलेट करने के लिए एक सरल सम्मिलित क्वेरी लिखें, और अवांछित पंक्तियों को हटा दें।
  2. यदि आपके पास कई टेबल हैं, तो 20 से अधिक टेबल कहें, या आप इस प्रक्रिया को कई बार (बड़े समाधान का हिस्सा) करना चाहते हैं, तो बस वह करें जो आप .NET में करना चाहते हैं। दूसरे शब्दों में, अपने कोड में अपने डेटाबेस की सभी टेबलों की सूची प्राप्त करें, फिर प्रत्येक तालिका के लिए, पहली पंक्ति प्राप्त करें, फिर संबंधित कॉलम शीर्षक आदि के साथ एक नई तालिका बनाएं। मुख्य बिंदु यह है कि, आपके पास बहुत कुछ है टी-एसक्यूएल की तुलना में .NET के पर्यावरण में शक्ति।
संबंधित मुद्दे