2012-06-14 12 views
56

जब मैं एक कर्सर पाश अंदर निम्नलिखित एसक्यूएल टुकड़ा चलाने का प्रयास,कर्सर लूप में उपयोग के लिए मैं एकाधिक कॉलम कैसे प्राप्त करूं?

set @cmd = N'exec sp_rename ' + @test + N',' + 
      RIGHT(@test,LEN(@test)-3) + '_Pct' + N',''COLUMN''' 

मैं निम्न संदेश मिलता है,

संदेश 15248, स्तर 11, राज्य 1, प्रक्रिया sp_rename, रेखा 213
या तो पैरामीटर @objname संदिग्ध है या दावा किया गया है @objtype (COLUMN) गलत है।

क्या गलत है और मैं इसे कैसे ठीक करूं? मैंने कॉलम नाम को ब्रैकेट [] में लपेटने की कोशिश की, और डबल कोट्स "" सुझाए गए कुछ खोज परिणामों की तरह।

संपादित करें 1 -

यहां संपूर्ण स्क्रिप्ट है। मैं नाम का नाम बदलने के लिए टेबल नाम कैसे पास करूं? मुझे यकीन नहीं है कि ऐसा कैसे करें क्योंकि स्तंभ नाम कई तालिकाओं में से एक में हैं।

BEGIN TRANSACTION 

declare @cnt int 
declare @test nvarchar(128) 
declare @cmd nvarchar(500) 
declare Tests cursor for 
SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME LIKE 'pct%' AND TABLE_NAME LIKE 'TestData%' 

open Tests 
fetch next from Tests into @test 
while @@fetch_status = 0 
BEGIN 
    set @cmd = N'exec sp_rename ' + @test + N',' + RIGHT(@test,LEN(@test)-3) + '_Pct' + N', column' 

    print @cmd 

    EXEC sp_executeSQL @cmd 

    fetch next from Tests into @test 
END 

close Tests 
deallocate Tests 


ROLLBACK TRANSACTION 
--COMMIT TRANSACTION 

संपादित करें 2 - स्क्रिप्ट "पीसीटी" उपसर्ग के साथ कॉलम जिनके नाम एक पैटर्न से मेल खाते हैं, इस मामले में नाम बदलने के लिए बनाया गया है। कॉलम डेटाबेस के भीतर विभिन्न तालिकाओं में होते हैं। सभी तालिका नाम "टेस्टडेटा" के साथ उपसर्ग किए गए हैं।

+1

यह लाइन एक स्ट्रिंग को जोड़ती है। आप इसे क्यों प्रिंट नहीं करते हैं ताकि आप देख सकें कि स्ट्रिंग की सामग्री क्या है, –

+0

'@ test' में 'table.column' या' schema.table.column'] का रूप है (http://msdn.microsoft .com/en-us/लाइब्रेरी/ms188351.aspx), है ना? – GSerg

+0

यदि @test में योग्य नाम है तो इसे apostrophes में होना आवश्यक है। यदि एक ही धारणा है, तो सही() तालिका नाम में पहले तीन वर्णों को हटा देगा; आप कॉलम नाम के अंतिम पात्रों को प्रतिस्थापित करना चाहते थे, यह 'LEFT' होगा। क्या आप कृपया सेट @test = ... जोड़कर स्क्रिप्ट का विस्तार कर सकते हैं? –

उत्तर

96

यहाँ थोड़ा संस्करण संशोधित किया गया है। परिवर्तन कोड कमेंटरी के रूप में जाना जाता है।

BEGIN TRANSACTION 

declare @cnt int 
declare @test nvarchar(128) 
-- variable to hold table name 
declare @tableName nvarchar(255) 
declare @cmd nvarchar(500) 
-- local means the cursor name is private to this code 
-- fast_forward enables some speed optimizations 
declare Tests cursor local fast_forward for 
SELECT COLUMN_NAME, TABLE_NAME 
    FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE COLUMN_NAME LIKE 'pct%' 
    AND TABLE_NAME LIKE 'TestData%' 

open Tests 
-- Instead of fetching twice, I rather set up no-exit loop 
while 1 = 1 
BEGIN 
    -- And then fetch 
    fetch next from Tests into @test, @tableName 
    -- And then, if no row is fetched, exit the loop 
    if @@fetch_status <> 0 
    begin 
    break 
    end 
    -- Quotename is needed if you ever use special characters 
    -- in table/column names. Spaces, reserved words etc. 
    -- Other changes add apostrophes at right places. 
    set @cmd = N'exec sp_rename ''' 
      + quotename(@tableName) 
      + '.' 
      + quotename(@test) 
      + N''',''' 
      + RIGHT(@test,LEN(@test)-3) 
      + '_Pct''' 
      + N', ''column''' 

    print @cmd 

    EXEC sp_executeSQL @cmd 
END 

close Tests 
deallocate Tests 

ROLLBACK TRANSACTION 
--COMMIT TRANSACTION 
+0

एसओ में मेरे पसंदीदा उत्तरों में से एक। –

+0

@RubensMariuzzo धन्यवाद, आप बहुत उदार हैं :-) –

+32

टीएलडीआर; db_cursor INTO '@ var1,' @ var2 –

-2

आप किसी स्तंभ का नाम बदलने का यह कह रहे हैं, लेकिन यह पता नहीं जो तालिका उस कॉलम में है

sp_rename:।

[ @objname = ] 'object_name'

है वर्तमान योग्य या उपयोगकर्ता ऑब्जेक्ट या डेटा प्रकार का अयोग्य नाम। यदि ऑब्जेक्ट का नाम बदलना एक तालिका में एक कॉलम है, तो ऑब्जेक्ट_नाम फॉर्म table.column या schema.table.column रूप में होना चाहिए।

(जोर जोड़ा)

संबंधित मुद्दे