আমি কার্সার লুপে ব্যবহারের জন্য একাধিক কলাম কীভাবে আনব?


90

আমি যখন কার্সার লুপের মধ্যে নিম্নলিখিত এসকিউএল স্নিপেটটি চালানোর চেষ্টা করি,

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 - স্ক্রিপ্টটি এমন কলামগুলির নাম পরিবর্তনের জন্য তৈরি করা হয়েছে যার নাম একটি প্যাটার্নের সাথে মেলে, এই ক্ষেত্রে "pct" উপসর্গ দিয়ে। কলামগুলি ডাটাবেসের মধ্যে বিভিন্ন সারণিতে ঘটে। সমস্ত টেবিলের নামগুলি "টেস্টডেটা" উপসর্গযুক্ত।


4
এই লাইনটি একটি স্ট্রিংকে যুক্ত করে। আপনি কেন এটি মুদ্রণ করেন না যাতে স্ট্রিংয়ের বিষয়বস্তু কী তা দেখতে পান,
প্রীত সংঘ


যদি @ টেষ্টটিতে যোগ্য নাম থাকে তবে এটি অ্যাস্টোস্ট্রোফের মধ্যে থাকা দরকার। যদি একই অনুমান ধারণ করে তবে ডান () প্রথম সারণির নাম অনুসারে তিনটি অক্ষর সরিয়ে ফেলবে; আপনি কলাম নামের শেষ অক্ষর প্রতিস্থাপন করতে চেয়েছিলেন এটি হবে LEFT। আপনি কি দয়া করে @ টেস্ট = ... সেট যোগ করে স্ক্রিপ্টটি কিছুটা প্রসারিত করতে পারেন?
নিকোলা মার্কোভিনোভিć

আপনার কোডটি আমাকে আসলে আমার সমস্যা সমাধানে সহায়তা করেছে - এর জন্য ধন্যবাদ!
নেভিল

উত্তর:


159

এখানে সামান্য পরিবর্তিত সংস্করণ। পরিবর্তনগুলি ভাষ্য হিসাবে মন্তব্য করা হয়েছে।

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

4
এসওতে আমার পছন্দের একটি উত্তর।
রুবেন্স মারিজুজ্জো

@ রুবেস মারিজুজ্জো ধন্যবাদ, আপনি খুব উদার হচ্ছেন :-)
নিকোলা মার্কোভিনোভিও

63
টিএলডিআর; Db_cursor এর থেকে পরবর্তী বার্তা @var1, @ var2
ডন রোলিং

8
টিএলডিআর সাধারণত দীর্ঘতর তথ্যের টুকরোটির একটি সংক্ষিপ্ত সংস্করণ নির্দেশ করতে ব্যবহৃত হয়। এটি দাঁড়ায় খুব বেশি দিন পড়েনি। আমি পরামর্শ দিচ্ছিলাম যে আপনি যে উত্তর দিয়েছেন এবং আমি দিয়েছি তার একটি সংক্ষিপ্ত সংস্করণ রয়েছে।
ডন রোলিং

4
সুন্দর টাচ, দুবার আনছে না। :)
বিজয়ী_জয়াইনার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.