আমি কল্পনা করেছিলাম যে টি-এসকিউএল তে আমি ভেরিয়েবলগুলি ব্যবহার করতে পারি না কেন?


18

আমাকে ক্ষমা করুন, আমি এমন বিকাশকারী যিনি এসকিউএল এর বিশ্বে চলে এসেছেন। আমি ভেবেছিলাম ভেরিয়েবল যুক্ত করে কিছু এসকিউএল উন্নত করতে পারি তবে এটি আমার প্রত্যাশার মতো কার্যকর হয়নি। কেউ আমাকে বলতে পারেন কেন এটি কাজ করে না? আমি আশেপাশে কোনও কাজ চাই না, কারণগুলি কেন এটির মতো কাজ করে না তা আমি জানতে চাই কারণ এটির একটি ভাল কারণ আছে বলে আমি নিশ্চিত হওয়া উচিত, তবে বর্তমানে এটি আমার থেকে লাফিয়ে উঠছে না।

DECLARE @DatabaseName varchar(150)
SET @DatabaseName = 'MyAmazingDatabaseName'

CREATE DATABASE @DatabaseName
GO

USE @DatabaseName
GO

তার জন্য আপনার গতিশীল স্কয়ার ব্যবহার করা দরকার। mssqltips.com/sqlservertip/1160/...
Stijn Wynants

3
আরে মন্তব্য করার জন্য ধন্যবাদ তবে আমার প্রশ্ন অনুসারে, এটি আমি উত্তর খুঁজছি না। আমি জানতে চাইছি যে কেউ দেখেছে আমি কেন এটি করতে পারি না কারণ আমি দেখিয়েছি।
গ্যারাথ

2
কারণ USEপ্যারামিটার সহ কমান্ডটি ব্যবহার করা সম্ভব নয় ।
টিটি।

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

1
আমরা ডাটাবেসের নাম এবং কলামের নামগুলি স্ট্রিংয়ের মান হিসাবে ভাবি, তবে এসকিউএল প্রসঙ্গে সেগুলি সনাক্তকারী। আপনি যা চেষ্টা করছেন তা x = 7 প্রত্যাশার সমান হবে; 'x' = 7 এর সমান হতে অন্য কিছু ভাষায়। 'X' = 7 এর সাথে x = 7 এর মতোই এমন একটি কম্পিউটার ভাষা তৈরি করা যেতে পারে, তেমনই একটি আরডিবিএমএস তৈরি করা যেতে পারে যা সারণী এক্স তৈরি করা সারণী 'এক্স' তৈরির মতো আচরণ করে। তবে এটি এসকিউএল হবে না।
ব্যবহারকারী 1008646

উত্তর:


20

ভেরিয়েবলের জন্য বই অনলাইন পৃষ্ঠা প্রতি

চলকগুলি কেবলমাত্র অভিব্যক্তিগুলিতে ব্যবহার করা যেতে পারে, অবজেক্টের নাম বা কীওয়ার্ডের জায়গায় নয়। গতিশীল এসকিউএল স্টেটমেন্টগুলি তৈরি করতে, এক্সিকিউট ব্যবহার করুন।

এটি আপনি যেভাবে প্রত্যাশা করেছিলেন সেভাবে কাজ করবে, উদাহরণস্বরূপ, আপনি যেখানে আপনার চলকটি যেখানে কোনও ধারাতে ব্যবহার করেছেন। কেন হিসাবে, আমি ভাবব এটির পার্সারটির সাথে ভেরিয়েবলটি মূল্যায়ন করতে না পারার সাথে কিছু করার আছে এবং এইভাবে অস্তিত্বের জন্য যাচাই করা যায়। এক্সিকিউট করার সময়, ক্যোয়ারিকে প্রথমে সিনট্যাক্স এবং অবজেক্টের জন্য পার্স করা হয় এবং তারপরে সফলভাবে পার্সিং করা হলে কোয়েরিটি কার্যকর করে যে বিন্দুতে চলকটি সেট করা হত।

DECLARE @name varchar(20);
SET @name = 'test';

CREATE TABLE [#tmp]([val] varchar(10));

insert into #tmp
values('test')

SELECT *
FROM [#tmp]
WHERE [val] = @name;

3
নোট করুন যে যখনই সম্ভব ডায়নামিক এসকিউএল এড়ানো উচিত। এটি evalজাভাস্ক্রিপ্ট এবং পাইথনের মতো পদ্ধতিগত ভাষায় ফাংশনগুলি ব্যবহার করার জন্য এসকিউএল এনালগ । এটি সুরক্ষা গর্ত তৈরি করার একটি দ্রুত উপায়।
jpmc26

1
@ jpmc26: গতিশীল এসকিউএল জড়িত না এমনটি করার আরও নিরাপদ উপায় কী?
রবার্ট হার্ভে

1
@ রবার্টহার্ভে কেবল এটিকে এড়িয়ে যাওয়ার অর্থ এই নয় যে সর্বদা একই কার্যকারিতা সহ কোনও বিকল্প নেই। ;) প্রায়শই উত্তরগুলির অংশটি হ'ল, "সমস্যার সম্পূর্ণ ভিন্ন সমাধান ব্যবহার করুন।" কখনও কখনও এটি করা সবচেয়ে ভাল কাজ, তবে আপনি ভাল বিকল্পগুলি অবহেলা করেননি তা নিশ্চিত করে এবং এটির একটি ভাল পরিমাণ ছাড়াই নয়, এবং তারপরেও, এটি একটি সতর্কতার সাথে স্বাস্থ্যকর ডোজ নিয়ে আসা উচিত।
jpmc26

2
@ jpmc26: ওপির উদাহরণটি দেখে মনে হচ্ছে যে একটি "কোড-ফার্স্ট" ওআরএম ডাটাবেসে টেবিল স্থাপন করতে পারে what গতিশীল এসকিউএল নীতিগতভাবে সুরক্ষিত থাকা সত্ত্বেও, শেষ ব্যবহারকারীটি কখনই সেই নির্দিষ্ট কোডটিকে স্পর্শ করবে না।
রবার্ট হার্ভে

@ রবার্টহার্ভে নির্ভর করে আপনি "শেষ ব্যবহারকারী" কে বিবেচনা করছেন। কোনও স্ক্রিপ্ট যা কোনও ডিবি মোতায়েন করে, আমি বিকাশকারী এবং সম্ভবত কিছু সিস্ট প্রশাসকদের "শেষ ব্যবহারকারী" হিসাবে বিবেচনা করব। দুর্ঘটনা এড়াতে ছাড়া অন্য কোনও কারণ না থাকলে আমি এখনও সেই ক্ষেত্রে নিরাপত্তাহীন ইনপুট প্রত্যাখ্যান করার জন্য সিস্টেমে ডিজাইন করব। এছাড়াও, "কখনই স্পর্শ করবেন না" হিসাবে ওপি এই কোডটি স্পর্শ করছে, তাই ...
jpmc26

17

এসকিউএল স্টেটমেন্টগুলিতে ভেরিয়েবলের ব্যবহারের সীমাবদ্ধতাগুলি এসকিউএলের আর্কিটেকচার থেকে উদ্ভূত হয়।

এসকিউএল বিবৃতি প্রক্রিয়াকরণে তিনটি পর্যায় রয়েছে:

  1. প্রস্তুতি - বিবৃতিটি বিশ্লেষণ করা হয়েছে এবং কোন কার্যকরকরণ পরিকল্পনা সংকলিত হয়েছে, তা উল্লেখ করে যে কোন ডাটাবেস অবজেক্টগুলি অ্যাক্সেস করা হয়, কীভাবে তারা অ্যাক্সেস করা হয় এবং সেগুলি কীভাবে সম্পর্কিত। এক্সিকিউশন প্ল্যানটি প্ল্যান ক্যাশে সংরক্ষণ করা হয় ।
  2. বাইন্ডিং - বিবৃতিতে কোনও ভেরিয়েবলগুলি প্রকৃত মানগুলির সাথে প্রতিস্থাপিত হয়।
  3. এক্সিকিউশন - ক্যাশেড প্ল্যানটি বাউন্ড মান সহ কার্যকর করা হয়।

এসকিউএল সার্ভার প্রোগ্রামার থেকে প্রস্তুতির পদক্ষেপটি গোপন করে এবং আরও বেশি traditionalতিহ্যবাহী ডেটাবেস যেমন ওরাকল এবং ডিবি 2 এর চেয়ে অনেক দ্রুত এটি সম্পাদন করে। এটি পারফরম্যান্সের কারণে যে এসকিউএল সম্ভাব্যভাবে একটি সর্বোত্তম বাস্তবায়ন পরিকল্পনা নির্ধারণ করতে অনেক সময় ব্যয় করে তবে এটি পুনরায় আরম্ভের পরে প্রথমবারের মতো বিবৃতিটিই আসে।

সুতরাং স্ট্যাটিক এসকিউএল , ভেরিয়েবল শুধুমাত্র স্থানে ব্যবহার করা যেতে পারে যেখানে তারা টেবিল নাম, কলাম নামে (যেখানে অবস্থায় কলাম নামে সহ), ইত্যাদি জন্য মৃত্যুদন্ড পরিকল্পনা অমান্য করবে না, তাই

ডায়নামিক এসকিউএল যেসব ক্ষেত্রে বিধিনিষেধকে ঘিরে কাজ করতে পারে না তার জন্য বিদ্যমান এবং প্রোগ্রামার জানেন যে এটি কার্যকর করতে কিছুটা বেশি সময় লাগবে। ডায়নামিক এসকিউএল দূষিত কোড ইনজেকশনের পক্ষে ঝুঁকির হতে পারে, তাই যত্ন নিন!


7

আপনি দেখতে পাচ্ছেন যে, "কেন" প্রশ্নের historicalতিহাসিক যুক্তি এবং ভাষার অন্তর্নিহিত অনুমান সহ এক অন্য ধরণের উত্তরের প্রয়োজন, আমি নিশ্চিত নই যে আমি সত্যই এই ন্যায়বিচারটি করতে পারব।

এসকিউএল এমভিপি এরল্যান্ড سومমারস্কোগের এই বিস্তৃত নিবন্ধটি যান্ত্রিকদের পাশাপাশি কিছু যুক্তি সরবরাহ করার চেষ্টা করে:

গতিশীল এসকিউএল এর অভিশাপ এবং আশীর্বাদ :

ক্যোয়ারী প্ল্যানিং ক্যাচিং

আপনি এসকিউএল সার্ভারে চালিত প্রতিটি ক্যোয়ারির জন্য একটি ক্যোয়ারী প্ল্যান দরকার। আপনি যখন প্রথমবার কোনও ক্যোয়ারী চালান, এসকিউএল সার্ভার এটির জন্য একটি কোয়েরি পরিকল্পনা তৈরি করে - বা পরিভাষা হিসাবে - এটি কোয়েরিকে সংকলন করে। এসকিউএল সার্ভার পরিকল্পনাকে ক্যাশে সংরক্ষণ করে এবং পরের বার আপনি যখন ক্যোয়ারী চালাবেন, পরিকল্পনাটি পুনরায় ব্যবহার করা হবে।

এটি (এবং সুরক্ষা, নীচে দেখুন) সম্ভবত সবচেয়ে বড় কারণ।

এসকিউএল এই ভিত্তিতে কাজ করে যে ক্যোরিগুলি ওয়ান-টাইম ক্রিয়াকলাপ নয়, তবে সেগুলি বারবার ব্যবহৃত হবে। যদি টেবিলটি (বা ডাটাবেস!) কোয়েরিতে সুনির্দিষ্টভাবে নির্দিষ্ট না করা থাকে তবে ভবিষ্যতের ব্যবহারের জন্য এটি কার্যকর করার পরিকল্পনা তৈরি এবং সংরক্ষণ করার কোনও উপায় নেই।

হ্যাঁ, আমরা চালিত প্রতিটি ক্যোয়ারী পুনরায় ব্যবহার করা হবে না, তবে এটি এসকিউএল এর ডিফল্ট অপারেটিং ভিত্তি , সুতরাং "ব্যতিক্রমগুলি" ব্যতিক্রমী বোঝানো।

আরও কয়েকটি কারণে এরল্যান্ড তালিকাভুক্ত করে (দ্রষ্টব্য যে তিনি স্পষ্টভাবে সঞ্চিত প্রক্রিয়াগুলি ব্যবহারের সুবিধাগুলি তালিকাভুক্ত করছেন , তবে এর মধ্যে অনেকগুলি প্যারামিটারাইজড (অ ডায়নামিক) প্রশ্নেরও সুবিধা রয়েছে):

  • পারমিশন সিস্টেম : এসকিউএল ইঞ্জিনটি ভবিষ্যদ্বাণী করতে পারে না যে আপনি যদি কোনও সারণী (বা ডাটাবেস) এর বিপরীতে কাজ করছেন তা না জেনে আপনার কাছে কোনও ক্যোয়ারী চালানোর অধিকার রয়েছে কিনা। ডায়নামিক এসকিউএল ব্যবহার করে "পারমিশন চেইন" বোতামের ব্যথা।
  • নেটওয়ার্ক ট্র্যাফিক হ্রাস করা: নেটওয়ার্কের মাধ্যমে সঞ্চিত প্রোক এবং কিছু প্যারামিটারের মান পাস করা দীর্ঘ ক্যোয়ারী স্টেটমেন্টের চেয়ে কম।
  • এনক্যাপসুলেটিং লজিক : আপনার অন্যান্য প্রোগ্রামিং পরিবেশ থেকে এনক্যাপসুলেটিং লজিকের সুবিধাগুলির সাথে পরিচিত হওয়া উচিত।
  • কী ব্যবহার করা হচ্ছে তার খোঁজ রাখা : যদি আমার কোনও কলাম সংজ্ঞা পরিবর্তন করতে হয়, আমি যে কোডটি বলে সেগুলি কীভাবে খুঁজে পাব? কোনও এসকিউএল ডাটাবেসের মধ্যে নির্ভরতা সন্ধানের জন্য সিস্টেমের পদ্ধতি বিদ্যমান রয়েছে তবে কোডটি যদি সঞ্চিত পদ্ধতিতে থাকে।
  • এসকিউএল কোড লেখার সহজ : আপনি একটি সঞ্চিত প্রক্রিয়া তৈরি বা সংশোধন করার সময় সিনট্যাক্স চেক হয়, সুতরাং আশা করা যায় ত্রুটিগুলির ফলস্বরূপ কম few
  • ত্রুটি এবং সমস্যাগুলি সম্বোধন : একটি ডিবিএ স্বতঃ-পরিবর্তনশীল গতিশীল এসকিউএল এর চেয়ে স্বতন্ত্র সঞ্চিত পদ্ধতির কার্যকারিতাটি খুব সহজেই সনাক্ত করতে এবং পরিমাপ করতে পারে।

আবার, এগুলির প্রত্যেকের একশটি সূক্ষ্মতা রয়েছে যা আমি এখানে প্রবেশ করব না।


2

আপনার ডায়নামিক স্কয়ার ব্যবহার করা দরকার

DECLARE @DatabaseName varchar(150) = 'dbamaint'
declare @sqltext nvarchar(max) = N''

set @sqltext = N'CREATE DATABASE '+quotename(@DatabaseName)+ ';'

print @sqltext 

-- once you are happy .. uncomment below
--exec sp_executesql @sqltext
set @sqltext = ''
set @sqltext = N'use '+quotename(@DatabaseName)+ ';'
print @sqltext 
-- once you are happy .. uncomment below
--exec sp_executesql @sqltext

নীচে মুদ্রণের আউটপুট দেওয়া আছে .. একবার আপনি exec sp_executesql @sqltextবিবরণী বিবৃতি আসলে কার্যকর করা হবে ...

CREATE DATABASE [dbamaint];
use [dbamaint];

1
হ্যাঁ ধন্যবাদ, আমি এটি জানি, তবে আমি জানতে চাইছি যে কেউ জানেন কেন আপনি কেবল চলকটি ব্যবহার করতে পারবেন না?
গ্যারাথ

টি-এসকিউএল পার্সার সিনট্যাক্স ত্রুটি নিক্ষেপ করবে। এটি বৈধ টি-এসকিউএল নয় যা পার্সার চিনে।
কিন শাহ

ধন্যবাদ কিন, আমি নিশ্চিত যে এর অবশ্যই ভাল কারণ থাকতে হবে। সম্ভবত কারণ ডাটাবেসের নামগুলিতে '@' থাকতে পারে এবং সম্ভবত আরও কিছু জটিল কারণ রয়েছে।
গ্যারেথ

1
হ্যাঁ, সেগুলিতে @ থাকতে পারে এবং আমি মনে করি এটির মূল কারণ। msdn.microsoft.com/en-us/library/ms175874.aspx
Pawel Tajs

1
@ গাজেরানো আমাকে বিশ্বাস করুন, যে কেউ এসকিউএল সার্ভারের সাথে কাজ করে তাতে সন্দেহ নেই যে আরও কমান্ড ধ্রুব সনাক্তকারীদের জায়গায় পরিবর্তনশীল গ্রহণ করবে।
db2
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.