কোয়েরি স্ট্রিংয়ের জন্য চলক ঘোষণা করুন


92

আমি ভাবছিলাম যে এমএস এসকিউএল সার্ভার 2005 এ এটি করার কোনও উপায় ছিল:

  DECLARE @theDate varchar(60)
  SET @theDate = '''2010-01-01'' AND ''2010-08-31 23:59:59'''

  SELECT    AdministratorCode, 
            SUM(Total) as theTotal, 
            SUM(WOD.Quantity) as theQty, 
            AVG(Total) as avgTotal, 
            (SELECT SUM(tblWOD.Amount)
                FROM tblWOD
                JOIN tblWO on tblWOD.OrderID = tblWO.ID
                WHERE tblWO.Approved = '1' 
                AND tblWO.AdministratorCode = tblWO.AdministratorCode
                AND tblWO.OrderDate BETWEEN @theDate
            )
 ... etc

এটা কি সম্ভব?


উত্তর:


97

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

DECLARE @theDate varchar(60)
SET @theDate = '''2010-01-01'' AND ''2010-08-31 23:59:59'''

DECLARE @SQL VARCHAR(MAX)  
SET @SQL = 'SELECT AdministratorCode, 
                   SUM(Total) as theTotal, 
                   SUM(WOD.Quantity) as theQty, 
                   AVG(Total) as avgTotal, 
                  (SELECT SUM(tblWOD.Amount)
                     FROM tblWOD
                     JOIN tblWO on tblWOD.OrderID = tblWO.ID
                    WHERE tblWO.Approved = ''1''
                      AND tblWO.AdministratorCode = tblWO.AdministratorCode
                      AND tblWO.OrderDate BETWEEN '+ @theDate +')'

EXEC(@SQL)

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

  • একটি আইএন ক্লজের জন্য কমা দ্বারা পৃথক করা মানগুলির তালিকা উপস্থাপনের জন্য একটি একক প্যারামিটার
  • মান এবং এসকিউএল সিনট্যাক্স উভয়কে উপস্থাপন করার জন্য একটি পরিবর্তনশীল (IE: আপনি সরবরাহ করেছেন উদাহরণ)

EXEC sp_executesql আপনাকে বাইন্ড / রেডিস্টেটমেন্ট প্যারামিটার ব্যবহার করার অনুমতি দেয় যাতে এসকিউএল ইঞ্জেকশন আক্রমণের জন্য আপনাকে একক উদ্ধৃতি / ইত্যাদি পালিয়ে যাওয়া নিয়ে নিজেকে উদ্বিগ্ন করতে হবে না।


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

52
DECLARE @theDate DATETIME
SET @theDate = '2010-01-01'

তারপরে এই যুক্তিটি ব্যবহার করতে আপনার জিজ্ঞাসাটি পরিবর্তন করুন:

AND 
(
    tblWO.OrderDate > DATEADD(MILLISECOND, -1, @theDate) 
    AND tblWO.OrderDate < DATEADD(DAY, 1, @theDate)
)

4
লেগে থাকা. যদি প্রশ্নটি পরিষ্কারভাবে দুটি পৃথক তারিখ দেখায় তবে এর উত্তর হতে পারে না। আপনি কীভাবে শেষ পর্যন্ত এটিকে কোড করলেন? উত্তরের '2010-08-31' তারিখটি কোথায়? এছাড়াও, প্রশ্নটি স্পষ্টভাবে জিজ্ঞাসা করে যে আপনি কোডটিকে অন্য একটি নির্বাচনী বিবৃতিতে বিকল্পের জন্য ডেকলার ভেরিয়েবলগুলি ব্যবহার করতে পারেন কিনা। সঠিক উত্তর নীচে।
Fandango68

2

এক্সইসি ব্যবহার করছি

আপনি এসকিউএল বিবৃতি তৈরির জন্য নিম্নলিখিত উদাহরণ ব্যবহার করতে পারেন।

DECLARE @sqlCommand varchar(1000)
DECLARE @columnList varchar(75)
DECLARE @city varchar(75)
SET @columnList = 'CustomerID, ContactName, City'
SET @city = '''London'''
SET @sqlCommand = 'SELECT ' + @columnList + ' FROM customers WHERE City = ' + @city
EXEC (@sqlCommand)

Sp_executesql ব্যবহার করে

এই পদ্ধতির ব্যবহারের মাধ্যমে আপনি নিশ্চিত করতে পারেন যে কোয়েরিতে থাকা ডেটা মানগুলি সঠিক ডেটাটাইপস এবং আরও উদ্ধৃতি ব্যবহার এড়ানো উচিত।

DECLARE @sqlCommand nvarchar(1000)
DECLARE @columnList varchar(75)
DECLARE @city varchar(75)
SET @columnList = 'CustomerID, ContactName, City'
SET @city = 'London'
SET @sqlCommand = 'SELECT ' + @columnList + ' FROM customers WHERE City = @city'
EXECUTE sp_executesql @sqlCommand, N'@city nvarchar(75)', @city = @city

রেফারেন্স


1

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

নিবন্ধটি থেকে: "সঠিক পদ্ধতিটি ব্যবহারকারীর সংজ্ঞায়িত ফাংশন বা সঞ্চিত প্রক্রিয়া সহ তালিকাকে টেবিলে আনপ্যাক করা।"

অবশ্যই, তালিকাটি একবার টেবিলের মধ্যে থাকলে আপনি একটি যোগদান ব্যবহার করতে পারেন। আমি শীর্ষ রেট করা উত্তরে সরাসরি মন্তব্য করতে পারিনি, তাই আমি এই মন্তব্যটি কেবল যুক্ত করেছি।



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