টি-এসকিউএল ডাটাবেস নামের জন্য একটি পরিবর্তনশীল কীভাবে ব্যবহার করবেন?


123

আমি আমার স্ক্রিপ্টে বেশ কয়েকটি জায়গায় ডাটাবেসের নাম ব্যবহার করি এবং আমি এটির দ্রুত পরিবর্তন করতে সক্ষম হতে চাই, তাই আমি এর মতো কিছু খুঁজছি:

DECLARE @DBNAME VARCHAR(50)
SET @DBNAME = 'TEST'

CREATE DATABASE @DBNAME
GO
ALTER DATABASE @DBNAME SET COMPATIBILITY_LEVEL = 90
GO
ALTER DATABASE @DBNAME SET RECOVERY SIMPLE 
GO

কিন্তু এটি কাজ করে না। তাহলে এই কোডটি লেখার সঠিক উপায় কী?

উত্তর:


135

পুরো স্ক্রিপ্টটিকে template SERVERNAME} স্থানধারক সহ একটি টেম্পলেট স্ট্রিংয়ে রাখুন। তারপরে স্ট্রিংটি সম্পাদনা করে:

SET @SQL_SCRIPT = REPLACE(@TEMPLATE, '{SERVERNAME}', @DBNAME)

এবং তারপর এটি দিয়ে চালান

EXECUTE (@SQL_SCRIPT)

এটা বিশ্বাস করা শক্ত যে, তিন বছরের ব্যবধানে, কেউই লক্ষ্য করেনি যে আমার কোডটি কার্যকর করে না !

আপনি EXECএকাধিক ব্যাচ করতে পারবেন না । GOএকটি ব্যাচ বিভাজক, কোনও টি-এসকিউএল বিবৃতি নয়। এটি তিনটি পৃথক স্ট্রিং তৈরি করা প্রয়োজন, এবং তারপরে EXECপ্রতিস্থাপনের পরে প্রত্যেকের জন্য ।

আমি মনে করি যে একক টেম্পলেট স্ট্রিংটিকে বিভাজন করে একাধিক সারিতে বিভক্ত করে কেউ "চালাক" করতে পারে GO; আমি এটি ADO.NET কোডে করেছি।

এবং আমি "SERVERNAME" শব্দটি কোথা থেকে পেয়েছি?

এখানে কিছু কোড রয়েছে যা আমি সবে পরীক্ষা করেছি (এবং যা কাজ করে):

DECLARE @DBNAME VARCHAR(255)
SET @DBNAME = 'TestDB'

DECLARE @CREATE_TEMPLATE VARCHAR(MAX)
DECLARE @COMPAT_TEMPLATE VARCHAR(MAX)
DECLARE @RECOVERY_TEMPLATE VARCHAR(MAX)

SET @CREATE_TEMPLATE = 'CREATE DATABASE {DBNAME}'
SET @COMPAT_TEMPLATE='ALTER DATABASE {DBNAME} SET COMPATIBILITY_LEVEL = 90'
SET @RECOVERY_TEMPLATE='ALTER DATABASE {DBNAME} SET RECOVERY SIMPLE'

DECLARE @SQL_SCRIPT VARCHAR(MAX)

SET @SQL_SCRIPT = REPLACE(@CREATE_TEMPLATE, '{DBNAME}', @DBNAME)
EXECUTE (@SQL_SCRIPT)

SET @SQL_SCRIPT = REPLACE(@COMPAT_TEMPLATE, '{DBNAME}', @DBNAME)
EXECUTE (@SQL_SCRIPT)

SET @SQL_SCRIPT = REPLACE(@RECOVERY_TEMPLATE, '{DBNAME}', @DBNAME)
EXECUTE (@SQL_SCRIPT)

2
+1 খুব সুন্দর পদ্ধতির ... আপনি আমাকে কেবলমাত্র এক টন কাজ থেকে বাঁচিয়েছিলেন, যদিও ... এটি এক্সিকিউট (@ এসকিউএলএসএসপিআরটি) হওয়া উচিত, বা কমপক্ষে এটি আমার জন্য কাজ করেছিল।
পুনরায় পোস্ট করুন

2
যদিও পালানোর ক্ষেত্রে সতর্কতা অবলম্বন করা উচিত।
usr

4
SYSNAMEসমস্ত সম্ভাব্য ডাটাবেস নাম (এবং সম্ভবত নামের উত্সের উপর নির্ভর করে এসকিউএল ইনজেকশন প্রতিরোধে) VARCHAR(255)ব্যবহার QUOTENAMEকরার জন্য ড্যাটাটাইপটি আরও উপযুক্ত হবে
মার্টিন স্মিথ

1
আমি CREATE SCHEMAঅন্য ডাটাবেসে চাইলে , কাজ করে না USE {DBNAME}। স্কিমা ভুল ডাটাবেসে তৈরি করে; /
বোম্বেরল্ট

103

আপনি এর sqlcmdজন্য মোডও ব্যবহার করতে পারেন (ম্যানেজমেন্ট স্টুডিওতে "ক্যোয়ারী" মেনুতে এটি সক্ষম করুন)।

:setvar dbname "TEST" 

CREATE DATABASE $(dbname)
GO
ALTER DATABASE $(dbname) SET COMPATIBILITY_LEVEL = 90
GO
ALTER DATABASE $(dbname) SET RECOVERY SIMPLE 
GO

সম্পাদনা করুন:

এসকিউএলসিএমডি সরঞ্জামের মাধ্যমে পরামিতিগুলি সেট করতে এই এমএসডিএন নিবন্ধটি দেখুন ।


1
এই পদ্ধতিটি ইতিমধ্যে ঘোষিত ভেরিয়েবলগুলি কীভাবে ব্যবহার করতে পারে? "টেস্ট" এর পরিবর্তে আপনি কি একটি @dbName যুক্ত করতে পারেন? আমি চেষ্টা করেছি এবং কাজ করিনি
23 এ 26

1
@ সাইকেলে একটি টিএসকিউএল পরিবর্তনশীল? স্ক্রিপ্টে এমনকি স্ক্রিপ্ট প্রেরণের আগে কোনও স্ক্যালি সিএমডি বিকল্পগুলি সঞ্চালিত হয় না।
মার্টিন স্মিথ

@ মার্টিনস্মিথ আরে আমি OUTPUT কমান্ড হিসাবে ডিবি নাম চাই want সুতরাং আমি কীভাবে এটি এসকিউএলএমএমডি ব্যবহার করতে পারি??
কুণাল কাক্কাদ

12

দুর্ভাগ্যক্রমে আপনি সেই বিন্যাসে ভেরিয়েবল সহ ডাটাবেসের নামগুলি ঘোষণা করতে পারবেন না।

আপনি যেটি সম্পাদন করতে চেষ্টা করছেন তার জন্য আপনাকে আপনার বিবৃতিগুলি একটি এক্সইসি () বিবৃতিতে আবৃত করতে হবে। সুতরাং আপনার মতো কিছু হবে:

DECLARE @Sql varchar(max) ='CREATE DATABASE ' + @DBNAME

তারপরে ফোন করুন

EXECUTE(@Sql) or sp_executesql(@Sql)

স্কয়ার স্ট্রিং এক্সিকিউট করতে।


EXECসঞ্চিত পদ্ধতি অনুসন্ধান করে। এই ক্ষেত্রে EXECUTEপ্রয়োজন।
বব ব্লগ

2
আসলে আমার ক্ষমা চাওয়া দরকার। এটি দেখা যাচ্ছে EXECএবং EXECUTEএকই। ব্যর্থ হয়ে EXECএবং সফল হওয়ার পরে আমি বিবৃতিটি দিয়েছিলাম EXECUTE। যদিও স্পষ্টতই আমার আসল সমস্যাটি উভয়ের সাথেই সম্পর্কিত নয়।
বব ব্লগ

2
উত্পাদনে এটি করবেন না ... কখনও।
ম্যাজিক অক্টোপাস উরান

@ ম্যাজিক অ্যাক্টপাস ইউরান পুরানো পোস্ট এবং খুব কমেন্টের পরিবর্তিত হয় তবে আমি কৌতূহল জানি কেন হয় না? এটি নির্দিষ্ট প্রয়োজনীয় হওয়া উচিত নয় ??
হার্শ

@ ম্যাজিক অ্যাক্টপাস ইউরান কি ইঞ্জেকশনের সম্ভাবনার কারণে এটি?
আইজাক রিফম্যান

5

আপনি তৈরি টেবিলের বিবৃতিতে কোনও ভেরিয়েবল ব্যবহার করতে পারবেন না। আমি সর্বোত্তম জিনিসটি যা সুপারিশ করতে পারি তা হল পুরো ক্যোয়ারিকে স্ট্রিং হিসাবে লিখুন এবং এটি সম্পাদন করুন।

এরকম কিছু চেষ্টা করুন:

declare @query varchar(max);
set @query = 'create database TEST...';

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