প্রোগ্রামিং হিসাবে টি-এসকিউএল মাধ্যমে ডেটাবেস রেফারেন্স


11

আমি একটি সঞ্চিত প্রক্রিয়া লিখছি যা একটি ডাটাবেস নামটিকে একটি আর্গুমেন্ট হিসাবে গ্রহণ করে এবং সেই ডাটাবেসের সূচীগুলির তালিকা এবং তাদের খণ্ডন স্তরকে একটি টেবিল প্রদান করে। এই সঞ্চিত পদ্ধতিটি আমাদের ডিবিএ ডাটাবেসে থাকবে (যে ডিবিতে টেবিলগুলি রয়েছে ডিবিএগুলিকে পর্যবেক্ষণ এবং অনুকূলকরণের জন্য ব্যবহার করে)। যদি কোনও পার্থক্য তৈরি হয় তবে প্রশ্নে থাকা সমস্ত সিস্টেমগুলি সমস্ত এসকিউএল সার্ভার 2008 আর 2 2

আমার কাছে প্রাথমিক জিজ্ঞাসাটি শেষ হয়ে গেছে, তবে সূচকের প্রকৃত নাম দেওয়ার চেষ্টা করতে গিয়ে আটকে আছি। আমার জ্ঞানের সর্বোপরি, সেই তথ্যটি প্রতিটি ব্যক্তির sys.indexes ভিউতে অন্তর্ভুক্ত থাকে। আমার সুনির্দিষ্ট সমস্যাটি অন্য ডেটাবেজের স্টোরেজ পদ্ধতি থেকে প্রোগ্রামটিমে ভিউটি রেফারেন্স দেওয়ার চেষ্টা করছে।

উদাহরণস্বরূপ, এটি ইস্যুতে ক্যোয়ারির অংশ:

FROM sys.dm_db_index_physical_stats(@db_id,NULL,NULL,NULL,NULL) p
INNER JOIN sys.indexes b ON p.[object_id] = b.[object_id] 
    AND p.index_id = b.index_id 
    AND b.index_id != 0

@Db_id দ্বারা চিহ্নিত ডাটাবেস থেকে কার্যকর করা হলে ক্যোয়ারীটি ঠিকঠাক কাজ করে, কারণ এটি সঠিক sys.indexes ভিউটি ব্যবহার করছে। আমি যদি ডিবিএ ডাটাবেস থেকে এটি কল করার চেষ্টা করি তবে, এটি সমস্তই বাতিল হয়ে যায়, কারণ সিএস.ইনডেক্সস ভিউটি ভুল ডাটাবেসের জন্য।

আরও সাধারণ পরিভাষায়, আমাকে এরকম কিছু করতে সক্ষম হতে হবে:

DECLARE @db_name NVARCHAR(255) = 'my_database';
SELECT * FROM @db_name + '.sys.indexes';

অথবা

USE @db_name;

আমি স্ট্রিং কনটেনটেশন এবং OBJECT_NAME / OBJECT_ID / DB_ID ফাংশনগুলির সংমিশ্রণ ব্যবহার করে ডেটাবেসগুলি স্যুইচ করার বা অন্যান্য ডেটাবেসগুলি রেফারেন্স করার চেষ্টা করেছি এবং কিছুই কাজ করছে বলে মনে হচ্ছে না। আমি সম্প্রদায়ের যে কোনও ধারণাগুলি থাকতে পারে তার প্রশংসা করব, তবে সন্দেহ করি যে প্রতিটি স্বতন্ত্র ডাটাবেসে থাকার জন্য আমাকে এই সঞ্চিত পদ্ধতিটি পুনরায় করতে হবে।

আপনার পরামর্শের জন্য ধন্যবাদ।


1
আমার সন্দেহ হয় এর জন্য আপনার গতিশীল এসকিউএল ব্যবহার করা দরকার ...
জেএনকে

উত্তর:


10

এই জাতীয় প্রশাসনিক কাজের জন্য ডায়নামিক এসকিউএল কার্যকর হয়। এখানে সঞ্চিত প্রক্রিয়াটির একটি স্নিপেট আমি লিখেছি যে কেবলমাত্র ডিফ্র্যাগমেন্টেশন স্তরগুলি পায় না, তবে ডিফ্র্যাগমেন্টেশন করার জন্য কোডও জেনারেট করে:

select @SQL = 
'
select getdate(),
       ''' + @@ServerName + ''',
       ''' + @DatabaseName + ''',
       so.Name,
       si.Name,
       db_id(''' + @DatabaseName + '''),
       ips.object_id,
       ips.index_id,
       ips.index_type_desc,
       ips.alloc_unit_type_desc,
       ips.index_depth,
       ips.avg_fragmentation_in_percent,
       ips.fragment_count,
       avg_fragment_size_in_pages,
       ips.page_count,
       ips.record_count,
       case
         when ips.index_id = 0 then ''alter table [' + @DatabaseName + '].'' + ss.name + ''.['' + so.name + ''] rebuild with (online = on)''
         else ''alter index '' + si.name + '' on [' + @DatabaseName + '].'' + ss.name + ''.['' + so.name + ''] rebuild with (online = on)''
       end
  from sys.dm_db_index_physical_stats(db_id(''' + @DatabaseName + '''),null,null,null, ''' + @SampleMode + ''') ips
  join [' + @DatabaseName + '].sys.objects so  on so.object_id = ips.object_id
  join [' + @DatabaseName + '].sys.schemas ss  on ss.schema_id = so.schema_id
  join [' + @DatabaseName + '].sys.indexes si  on si.object_id = ips.object_id
                      and si.index_id  = ips.index_id
order by so.Name, ips.index_id
'

exec (@SQL)

জেএনকে-র মন্তব্যের ভিত্তিতে আমি গতিশীল এসকিউএল নিয়োগের জন্য আমার জিজ্ঞাসাকে পরিবর্তন করেছি। এটি অবশ্যই কাজ করে। ডিফ্রেগ কোড উত্পন্ন করার জন্য আমার একটি পৃথক ক্যোয়ারী রয়েছে। আমি এটিকে একটি রান দেব এবং এটি কেমন দেখাচ্ছে। যদিও এটির উত্তর হিসাবে গ্রহণ করা।
mdoyle

একটি বিষয় লক্ষণীয় ... এটি এসকিউএল সার্ভার 2008R2 এন্টারপ্রাইজ সংস্করণে চলে। "পুনর্নির্মাণ (অনলাইনে = অন)" মানক সংস্করণে সমর্থিত নয়।
ডেটাগোড

1
মিষ্টি, আপনার উত্তরটি এখনই আপ-আপ করার মতো যথেষ্ট পরিমাণে প্রতিবেদন আমার কাছে রয়েছে। :-) এটি একটি চটজলদি ক্যোয়ারী, তবে আমি কোড উত্পন্ন উত্পন্ন ক্যোয়ারী আলাদা রাখতে পছন্দ করি। আমি ফলাফলগুলি পাঠ্যে পাঠানো এবং চাকরিতে কাট-এন-পেস্ট করতে সক্ষম হতে পছন্দ করি। খুব মার্জিত সমাধান সব একই - ধন্যবাদ!
mdoyle

8

গতিশীল এসকিউএল বিকল্প নেই SQLCMD , যা কমান্ড লাইন, এজেন্ট কাজ পদক্ষেপ, থেকে প্রার্থনা করা যেতে পারে ডাকা-Sqlcmd PowerShell cmdlet বা সক্রিয় SSMS । এসকিউএলসিএমডি সিনট্যাক্সে আপনার উদাহরণটি হ'ল:

:SETVAR DatabaseName MyDatabase

SELECT * FROM $(DatabaseName).sys.indexes;

এসকিউএলসিএমডি মোড হ'ল সেই বৈশিষ্ট্যগুলির মধ্যে একটি যা আমি আশা করি আগে সম্পর্কে জানতাম। প্রচুর পরিস্থিতিতে সুবিধাজনক।


1
এটি পাওয়ারশেলের সাথে পরিপূর্ণতা অর্জন করতে খুব সহজ এবং মার্জিত। আমি আপনার পদ্ধতির পছন্দ, মার্ক। +1
টমাস স্ট্রিংগার

@ শার্ক ভালো কথা, আমি পাওয়ারশেল সেন্টিমিডলেটটি সম্পাদনা করব
মার্ক

এছাড়াও একটি ভাল সমাধান, আমি এটিও সন্ধান করব।
mdoyle

এটি দুর্দান্ত, এটি টিএসকিউএল সমর্থিত না হওয়ার কোনও কারণ আছে কি?
tbone

0

একটি ভিন্ন ডিবিতে থাকা প্রক্রিয়া থেকে এক সারণীর এক সেট উল্লেখ করা সাধারণত মুশকিল। যদি আপনি সিস্টেম পদ্ধতি হিসাবে মাস্টারে আপনার পদ্ধতিটি ইনস্টল করেন তবে এটি নিজের কাছে আবার উল্লেখ না করে অন্য ডিবি প্রসঙ্গে ব্যবহার করা যেতে পারে।

আমি মনে করি যে: যদি আপনার পদ্ধতিটি 'sp_' দিয়ে শুরু হয় তবে এটি সর্বজনীনভাবে দৃশ্যমান হয় এবং আপনি যদি এটি 'sys.sp_%' স্কিমে সংজ্ঞায়িত করেন তবে এটি অন্যান্য ডিবি প্রসঙ্গে ব্যবহার করা যেতে পারে।

এটি গতিশীলভাবে ডিবি_নামে প্লাগ না করে একাধিক ডিবিতে পরিচালনা করার একটি বিকল্প উপায় সরবরাহ করবে।

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