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


11

ডায়নামিক এসকিউএলে উল্লিখিত ডাটাবেসে এসএসএমএসের প্রসঙ্গটি পরিবর্তনশীল করার চেষ্টা করতে আমার সমস্যা হচ্ছে:

EXEC sys.sp_executesql N'USE db1 ' ;

এটি সফলভাবে সম্পাদন করে তবে এসএসএমএসের ডাটাবেস প্রসঙ্গে পরিবর্তন হয় না।

আমি উপরের মতো কিছুটা পরিবর্তন করার চেষ্টা করেছি

DECLARE @sql NVARCHAR(100) DECLARE @db NVARCHAR(50)
SET @db = N'db1' SET @sql = N'Use ' + @db
EXEC sp_executesql @sql

আবার, এটি সফলভাবে সম্পাদন করে তবে ডাটাবেস পরিবর্তন হয় না।


4
আপনি এসএসএমএসে যে সেশনটি ব্যবহার করছেন তার জন্য আপনি sp_executesql এর মধ্যে প্রসঙ্গটি পরিবর্তন করতে পারবেন না। প্রসঙ্গটি কেবল আপনার গতিশীল এসকিউএল সেশনের সময় বৈধ - এসএসএমএস সেশনের জন্য নয়।
লোথর ক্রনার

উত্তর:


7

এসএসএমএস, আমি পুনরায় বলব না, আপনি ডায়ামানিক এসকিউএলে চালিত কোনও ব্যবহারকারীর আদেশের কন্টেন্টে স্যুইচ করবেন না

যদি চূড়ান্ত লক্ষ্যটি নির্বাচিত ডাটাবেসের ভিতরে অন্য কিছু গতিশীল এসকিউএল চালানো হয় তবে এটি যথেষ্ট সহজ:

DECLARE @db sysname = N'db1';

DECLARE @exec nvarchar(max) = QUOTENAME(@db) + N'.sys.sp_executesql',
        @sql  nvarchar(max) = N'SELECT DB_NAME();';

EXEC @exec @sql;

আপনার যদি প্যারামিটারগুলি পাস করতে হয় তবে কোনও সমস্যা নেই:

DECLARE @db sysname = N'db1', @i int = 1;

DECLARE @exec nvarchar(max) = QUOTENAME(@db) + N'.sys.sp_executesql',
        @sql  nvarchar(max) = N'SELECT DB_NAME(), @i;';

EXEC @exec @sql, N'@i int', @i;

যদি লক্ষ্যটি নির্বাচিত ডাটাবেসের অভ্যন্তরে কিছু স্থিতিশীল এসকিউএল চালানো হয় , তবে আপনার সেই স্ট্যাটিক এসকিউএল প্রতিটি ডাটাবেসে একটি সঞ্চিত পদ্ধতিতে সংরক্ষণ করার এবং এটিকে গতিশীলভাবে কল করার কথা বিবেচনা করা উচিত:

DECLARE @db sysname = N'db1';

DECLARE @exec nvarchar(max) = QUOTENAME(@db) + N'.sys.sp_executesql',
        @sql  nvarchar(max) = N'EXEC dbo.procedurename;';

EXEC @exec @sql;

এবং আশা করা যায় চূড়ান্ত লক্ষ্য এসএসএমএসে এই সমস্ত কোডটি চালানো নয় যাতে এসএসএমএস এখন প্রসঙ্গে আছে @db... ড্যানিয়েল সত্যিই এটি পছন্দ করবে যদি আমি স্পষ্টভাবে বলি যে এটি সম্ভব নয়, যেমন @ লোথারের মন্তব্যে আরও বলা হয়েছে।


এটি দুর্দান্ত, ধন্যবাদ অ্যারন বার্ট্র্যান্ডকে। এবং না, চূড়ান্ত লক্ষ্যটি এসএসএমএসে এই সমস্ত কোডটি চালানো নয় যাতে এসএসএমএস এখন @db এর প্রসঙ্গে
মাজহার

2

ডায়নামিক এসকিউএল আসলে আপনার বাকী কোডের একটি পৃথক সত্তার সাথে নির্দিষ্টভাবে ইন-লাইন কার্যকর করা হয় না (যদিও এটি চালানো হয় যেমন এটি লাইনটিতে রয়েছে

আপনি যদি কোডটি চালনা করেন: SET @sql = N'Use ' + @db + '; select DB_NAME(); select @@spid'আপনার বর্তমান সেটের প্লেসে আপনি ফিরে আসা ফলাফলগুলি লক্ষ্য করবেন যে আপনি সক্রিয় ডাটাবেস সরিয়ে নিয়েছেন তবে আপনি এখনও একই সংযোগে চলেছেন।

আপনি যদি ইন-লাইন ডাটাবেস নির্বাচন পরিবর্তন করতে চান তবে ভাল কিছু হ'ল:

IF @db = 'db1'
    USE db1
ELSE IF @db = 'db2'
    USE db2

এটি সুন্দর বা পরিষ্কার নয় এবং সম্ভাব্য ডাটাবেসের জন্য দুটি লাইনের প্রয়োজন তবে এটি কাজটি সম্পন্ন করবে (এটি ডায়নামিক এসকিউএল এ চালান না বা আপনি এখনও মূল থ্রেড পরিবর্তন না করে একই সমস্যাটি শেষ করবেন)

নোট যদিও ইউএসই কমান্ড ব্যবহার পদ্ধতি বা ফাংশন নিষিদ্ধ

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