Μεταβλητές SQL: Δήλωση, ορισμός και επιλογή μεταβλητής στον SQL Server

⚡ Έξυπνη Σύνοψη

Οι μεταβλητές του SQL Server είναι επώνυμα αντικείμενα που λειτουργούν ως placeholders για μια μεμονωμένη τιμή δεδομένων στη μνήμη. Μια μεταβλητή πρέπει να δηλωθεί με την πρόταση DECLARE προτού της αντιστοιχιστεί μια τιμή και επαναχρησιμοποιηθεί.

  • 📦 Ορισμός: Μια μεταβλητή SQL Server περιέχει μία τιμή και λειτουργεί ως σύμβολο κράτησης θέσης για μια θέση μνήμης.
  • ???? Τοπικό και Παγκόσμιο: Ο SQL Server υποστηρίζει τοπικές μεταβλητές με πρόθεμα @ που δηλώνουν οι χρήστες, καθώς και καθολικές μεταβλητές που διατηρούνται από το σύστημα και έχουν πρόθεμα @@.
  • 📝 ΔΗΛΩΝΩ: Η εντολή DECLARE δημιουργεί μια μεταβλητή και, από προεπιλογή, την αρχικοποιεί σε NULL.
  • 🔀 Τρεις μέθοδοι ανάθεσης: Μια τιμή μπορεί να αντιστοιχιστεί κατά τη διάρκεια της DECLARE, με SET ή με SELECT.
  • 🔎 Βαθμωτά υποερωτήματα: Οι εντολές SET και SELECT μπορούν και οι δύο να διαβάσουν μια μεμονωμένη τιμή από ένα ερώτημα σε μια μεταβλητή.
  • 🧠 SET έναντι SELECT: Η εντολή SET αντιστοιχίζει μία μεταβλητή και ακολουθεί το πρότυπο ANSI, ενώ η εντολή SELECT μπορεί να αντιστοιχίσει πολλές ταυτόχρονα.

Μεταβλητές SQL Server: DECLARE, SET και SELECT

Τι είναι μια μεταβλητή στον SQL Server;

In MS SQL Server, οι μεταβλητές είναι αντικείμενα που λειτουργούν ως placeholders για μια θέση μνήμης. Μια μεταβλητή περιέχει μια μεμονωμένη τιμή δεδομένων που μπορείτε να διαβάσετε και να επαναχρησιμοποιήσετε σε μια δέσμη ή διαδικασία.

Τύποι μεταβλητών σε SQL: Τοπικό, Καθολικό

Ο MS SQL Server έχει δύο τύπους μεταβλητών:

  • Τοπική μεταβλητή
  • Καθολική μεταβλητή

Ωστόσο, ένας χρήστης μπορεί να δημιουργήσει μόνο μια τοπική μεταβλητή. Το παρακάτω σχήμα εξηγεί τους δύο τύπους μεταβλητών που είναι διαθέσιμοι στο MS SQL Server.

Διάγραμμα των δύο τύπων μεταβλητών στον SQL Server: τοπικές μεταβλητές και καθολικές μεταβλητές

Τοπική μεταβλητή

  • Ένας χρήστης δηλώνει την τοπική μεταβλητή.
  • Από προεπιλογή, το όνομα μιας τοπικής μεταβλητής ξεκινά με @.
  • Κάθε τοπική μεταβλητή έχει εύρος ζώνης στην τρέχουσα παρτίδα ή διαδικασία εντός μιας δεδομένης συνεδρίας.

Καθολική μεταβλητή

  • Το σύστημα διατηρεί την καθολική μεταβλητή· ένας χρήστης δεν μπορεί να δηλώσει μία.
  • Ένα όνομα καθολικής μεταβλητής ξεκινά με @@.
  • Αποθηκεύει πληροφορίες που σχετίζονται με την περίοδο λειτουργίας.

Πώς να ΔΗΛΩΣΕΤΕ μια μεταβλητή στην SQL

Πριν από τη χρήση οποιασδήποτε μεταβλητής σε μια παρτίδα ή διαδικασία στο SQL, πρέπει να το δηλώσετε. Η εντολή DECLARE δημιουργεί μια μεταβλητή που λειτουργεί ως placeholder για μια θέση μνήμης. Μόνο αφού γίνει η δήλωση μπορεί η μεταβλητή να χρησιμοποιηθεί στο επόμενο μέρος της δέσμης ή της διαδικασίας.

Σύνταξη TSQL:

DECLARE  { @LOCAL_VARIABLE[AS] data_type  [ = value ] }

κανόνες:

  • Η αρχικοποίηση είναι προαιρετική κατά τη δήλωση.
  • Από προεπιλογή, το DECLARE αρχικοποιεί τη μεταβλητή σε NULL.
  • Η χρήση της λέξης-κλειδιού «AS» είναι προαιρετική.
  • Για να δηλώσετε περισσότερες από μία τοπικές μεταβλητές, προσθέστε ένα κόμμα μετά τον πρώτο ορισμό και, στη συνέχεια, δώστε το όνομα της επόμενης μεταβλητής. Τύπος δεδομένων.

Παραδείγματα δήλωσης μεταβλητής

Ερώτημα: Με "AS"

DECLARE @COURSE_ID AS INT;

Ερώτημα: Χωρίς "AS"

DECLARE @COURSE_NAME VARCHAR (10);

Ερώτημα: ΔΗΛΩΣΤΕ δύο μεταβλητές

DECLARE @COURSE_ID AS INT, @COURSE_NAME VARCHAR (10);

Εκχώρηση τιμής στη μεταβλητή SQL

Μπορείτε να αντιστοιχίσετε μια τιμή σε μια μεταβλητή με τους ακόλουθους τρεις τρόπους:

  • Κατά τη δήλωση μεταβλητών χρησιμοποιώντας τη λέξη-κλειδί DECLARE.
  • Χρησιμοποιώντας το SET.
  • Χρησιμοποιώντας την ΕΠΙΛΟΓΗ.

Ας δούμε και τους τρεις τρόπους αναλυτικά.

Κατά τη δήλωση μεταβλητής χρησιμοποιώντας λέξη-κλειδί DECLARE

Σύνταξη T-SQL:

DECLARE { @Local_Variable [AS] Datatype [ = value ] }

Εδώ, μετά τον τύπο δεδομένων μπορείτε να χρησιμοποιήσετε το σύμβολο '=' ακολουθούμενο από την τιμή που θα αντιστοιχιστεί.

Ερώτηση:

DECLARE @COURSE_ID AS INT = 5
PRINT @COURSE_ID

Η εκτέλεση του ερωτήματος εκτυπώνει την τιμή που έχει αντιστοιχιστεί κατά τη δήλωση, όπως φαίνεται παρακάτω.

Έξοδος μιας μεταβλητής που έχει ανατεθεί κατά τη διάρκεια του DECLARE, με εκτύπωση της τιμής 5

Χρήση μεταβλητής SQL SET

Μερικές φορές θέλετε να διατηρήσετε τη δήλωση και την αρχικοποίηση ξεχωριστά. Το SET αντιστοιχίζει μια τιμή στη μεταβλητή αφού δηλωθεί. Παρακάτω αναφέρονται οι διαφορετικοί τρόποι αντιστοίχισης τιμών χρησιμοποιώντας το SET.

Παράδειγμα: Ανάθεση τιμής σε μια μεταβλητή χρησιμοποιώντας το SET

Σύνταξη:

DECLARE @Local_Variable <Data_Type>
SET @Local_Variable =  <Value>

Ερώτηση:

DECLARE @COURSE_ID AS INT
SET @COURSE_ID = 5
PRINT @COURSE_ID

Η εκτέλεση του σεναρίου επιστρέφει την τιμή που έχει αντιστοιχιστεί με την εντολή SET, η οποία φαίνεται παρακάτω.

Έξοδος ανάθεσης τιμής σε μια μεταβλητή χρησιμοποιώντας SET, εκτύπωση 5

Παράδειγμα: Αντιστοίχιση τιμής σε πολλαπλές μεταβλητές χρησιμοποιώντας τη συνάρτηση SET

Σύνταξη:

DECLARE @Local_Variable _1 <Data_Type>, @Local_Variable_2 <Data_Type>,
SET @Local_Variable_1 = <Value_1>
SET @Local_Variable_2 = <Value_2>

Κανόνας: Μία λέξη-κλειδί SET μπορεί να αντιστοιχίσει τιμή μόνο σε μία μεταβλητή.

Ερώτηση:

DECLARE @COURSE_ID as INT, @COURSE_NAME AS VARCHAR(5)
SET @COURSE_ID = 5
SET @COURSE_NAME = 'UNIX'
PRINT @COURSE_ID
PRINT @COURSE_NAME

Οι δύο εντολές PRINT επιστρέφουν και τις δύο τιμές που έχουν αντιστοιχιστεί, όπως φαίνεται παρακάτω.

Έξοδος ανάθεσης δύο μεταβλητών με SET, εκτύπωση 5 και UNIX

Παράδειγμα: Ανάθεση τιμής σε μια μεταβλητή με ένα βαθμωτό υποερώτημα χρησιμοποιώντας το SET

Σύνταξη:

DECLARE @Local_Variable_1 <Data_Type>, @Local_Variable_2 <Data_Type>,SET @Local_Variable_1 = (SELECT <Column_1> from <Table_Name> where <Condition_1>)

κανόνες:

  • Περικλείστε το ερώτημα σε παρενθέσεις.
  • Το ερώτημα θα πρέπει να είναι ένα βαθμωτό ερώτημα, που σημαίνει ότι επιστρέφει μόνο μία γραμμή και μία στήλη. Διαφορετικά, το ερώτημα εμφανίζει σφάλμα.
  • Εάν το ερώτημα επιστρέψει μηδενικές γραμμές, τότε η μεταβλητή ορίζεται σε EMPTY, δηλαδή, NULL.

Υποθέστε ότι έχουμε το τραπέζι με το όνομα 'Guru99' με δύο στήλες, όπως εμφανίζεται παρακάτω. Αυτός ο πίνακας χρησιμοποιείται στα ακόλουθα παραδείγματα.

GuruΠίνακας 99 με τις στήλες Tutorial_ID και Tutorial_name που χρησιμοποιούνται στα παραδείγματα

Παράδειγμα 1: Όταν το υποερώτημα επιστρέφει μία γραμμή ως αποτέλεσμα

DECLARE @COURSE_NAME VARCHAR (10)
SET @COURSE_NAME = (select Tutorial_name from Guru99 where Tutorial_ID = 3)
PRINT @COURSE_NAME

Επειδή το υποερώτημα επιστρέφει μία αντίστοιχη γραμμή, η μεταβλητή λαμβάνει αυτήν την τιμή, όπως φαίνεται παρακάτω.

Έξοδος ενός βαθμωτού υποερωτήματος που έχει αντιστοιχιστεί με SET, με εκτύπωση του αντίστοιχου ονόματος εκπαιδευτικού υλικού

Παράδειγμα 2: Όταν το υποερώτημα επιστρέφει μηδενικές γραμμές ως αποτέλεσμα

DECLARE @COURSE_NAME VARCHAR (10)
SET @COURSE_NAME = (select Tutorial_name from Guru99 where Tutorial_ID = 5)
PRINT @COURSE_NAME

Επειδή το υποερώτημα δεν επιστρέφει γραμμές, η τιμή της μεταβλητής είναι ΚΕΝΟ, δηλαδή NULL, επομένως δεν εκτυπώνεται τίποτα, όπως φαίνεται παρακάτω.

Έξοδος ενός υποερωτήματος SET βαθμωτού που δεν επιστρέφει γραμμές, αφήνοντας τη μεταβλητή NULL

Χρήση μεταβλητής SQL SELECT

Όπως ακριβώς και με το SET, μπορείτε επίσης να χρησιμοποιήσετε την εντολή SELECT για να αντιστοιχίσετε τιμές σε μεταβλητές αφού τις δηλώσετε με την εντολή DECLARE. Παρακάτω θα βρείτε διαφορετικούς τρόπους για να αντιστοιχίσετε μια τιμή χρησιμοποιώντας την εντολή SELECT.

Παράδειγμα: Ανάθεση τιμής σε μια μεταβλητή χρησιμοποιώντας το SELECT

Σύνταξη:

DECLARE @LOCAL_VARIABLE <Data_Type>
SELECT @LOCAL_VARIABLE = <Value>

Ερώτηση:

DECLARE @COURSE_ID INT
SELECT @COURSE_ID = 5
PRINT @COURSE_ID

Η ανάθεση SELECT εκτυπώνει την τιμή, όπως φαίνεται παρακάτω.

Έξοδος ανάθεσης τιμής σε μια μεταβλητή χρησιμοποιώντας SELECT, με εκτύπωση 5

Παράδειγμα: Ανάθεση τιμής σε πολλαπλές μεταβλητές χρησιμοποιώντας το SELECT

Σύνταξη:

DECLARE @Local_Variable _1 <Data_Type>, @Local_Variable _2 <Data_Type>,SELECT @Local_Variable _1 = <Value_1>,  @Local_Variable _2 = <Value_2>

Κανόνας: Σε αντίθεση με το SET, το SELECT μπορεί να αντιστοιχίσει μια τιμή σε πολλαπλές μεταβλητές χωρισμένες με κόμματα.

DECLARE @COURSE_ID as INT, @COURSE_NAME AS VARCHAR(5)
SELECT @COURSE_ID = 5, @COURSE_NAME = 'UNIX'
PRINT @COURSE_ID
PRINT @COURSE_NAME

Και οι δύο μεταβλητές αντιστοιχίζονται σε ένα μόνο SELECT, όπως φαίνεται παρακάτω.

Έξοδος ανάθεσης δύο μεταβλητών με ένα μόνο SELECT, εκτύπωση 5 και UNIX

Παράδειγμα: Ανάθεση της τιμής σε μια μεταβλητή με ένα υποερώτημα χρησιμοποιώντας SELECT

Σύνταξη:

DECLARE @Local_Variable_1 <Data_Type>, @Local_Variable _2 <Data_Type>,SELECT @Local_Variable _1 = (SELECT <Column_1> from <Table_name> where <Condition_1>)

κανόνες:

  • Περικλείστε το ερώτημα σε παρενθέσεις.
  • Το ερώτημα θα πρέπει να είναι ένα βαθμωτό ερώτημα που επιστρέφει μία γραμμή και μία στήλη. Διαφορετικά, το ερώτημα εμφανίζει σφάλμα.
  • Εάν το ερώτημα επιστρέψει μηδενικές γραμμές, τότε η μεταβλητή είναι ΚΕΝΟ, δηλαδή NULL.

Επανεξετάστε το δικό μαςGuruΤραπέζι 99'.

Παράδειγμα 1: Όταν το υποερώτημα επιστρέφει μία γραμμή ως αποτέλεσμα

DECLARE @COURSE_NAME VARCHAR (10)
SELECT @COURSE_NAME = (select Tutorial_name from Guru99 where Tutorial_ID = 1)
PRINT @COURSE_NAME

Το υποερώτημα επιστρέφει μία γραμμή, επομένως η μεταβλητή διατηρεί αυτήν την τιμή, όπως φαίνεται παρακάτω.

Έξοδος ενός βαθμωτού υποερωτήματος που έχει αντιστοιχιστεί με SELECT, με εκτύπωση του αντίστοιχου ονόματος εκπαιδευτικού υλικού

Παράδειγμα 2: Όταν το υποερώτημα επιστρέφει μηδενικές γραμμές ως αποτέλεσμα

DECLARE @COURSE_NAME VARCHAR (10)
SELECT @COURSE_NAME = (select Tutorial_name from Guru99 where Tutorial_ID = 5)
PRINT @COURSE_NAME

Χωρίς αντίστοιχη γραμμή, η μεταβλητή παραμένει ΚΕΝΟ, δηλαδή NULL, όπως φαίνεται παρακάτω.

Έξοδος ενός υποερωτήματος SELECT βαθμωτού που δεν επιστρέφει γραμμές, αφήνοντας τη μεταβλητή NULL

Παράδειγμα 3: Αντιστοίχιση τιμής σε μια μεταβλητή με μια κανονική εντολή SELECT

Σύνταξη:

DECLARE @Local_Variable _1 <Data_Type>, @Local_Variable _2 <Data_Type>,SELECT @Local_Variable _1 = <Column_1> from <Table_name> where <Condition_1>

κανόνες:

  • Σε αντίθεση με το SET, εάν το ερώτημα επιστρέφει πολλές γραμμές, τότε η τιμή της μεταβλητής ορίζεται στην τιμή της τελευταίας γραμμής.
  • Εάν το ερώτημα επιστρέψει μηδενικές γραμμές, τότε η μεταβλητή ορίζεται σε EMPTY, δηλαδή, NULL.

Ερώτημα 1: Το ερώτημα επιστρέφει μία γραμμή

DECLARE @COURSE_NAME VARCHAR (10)
SELECT @COURSE_NAME = Tutorial_name from Guru99 where Tutorial_ID = 3
PRINT @COURSE_NAME

Η μοναδική αντίστοιχη γραμμή ορίζει την τιμή της μεταβλητής, όπως φαίνεται παρακάτω.

Έξοδος μιας κανονικής ανάθεσης SELECT που επιστρέφει μία γραμμή

Ερώτημα 2: Το ερώτημα επιστρέφει πολλαπλές γραμμές

DECLARE @COURSE_NAME VARCHAR (10)
SELECT @COURSE_NAME = Tutorial_name from Guru99
PRINT @COURSE_NAME

Όταν ταιριάζουν αρκετές γραμμές, η μεταβλητή διατηρεί την τιμή από την τελευταία γραμμή, όπως φαίνεται παρακάτω.

Έξοδος μιας κανονικής ανάθεσης SELECT που επιστρέφει πολλαπλές γραμμές, keeping η τιμή της τελευταίας γραμμής

Ερώτημα 3: Το ερώτημα επιστρέφει μηδενικές γραμμές

DECLARE @COURSE_NAME VARCHAR (10)
SELECT @COURSE_NAME = Tutorial_name from Guru99 where Tutorial_ID = 5
PRINT @COURSE_NAME

Όταν δεν υπάρχουν γραμμές που να ταιριάζουν, η μεταβλητή είναι ΚΕΝΟ, δηλαδή NULL, όπως φαίνεται παρακάτω.

Έξοδος μιας κανονικής ανάθεσης SELECT που δεν επιστρέφει γραμμές, αφήνοντας τη μεταβλητή NULL

Άλλα παραδείγματα μεταβλητών SQL

Μια δηλωμένη μεταβλητή μπορεί επίσης να χρησιμοποιηθεί μέσα σε ένα ερώτημα, για παράδειγμα σε μια ρήτρα WHERE για το φιλτράρισμα γραμμών.

Ερώτηση:

DECLARE @COURSE_ID Int = 1
SELECT * from Guru99 where Tutorial_id = @COURSE_ID

Η μεταβλητή φιλτράρει το ερώτημα και επιστρέφει την αντίστοιχη γραμμή, όπως φαίνεται παρακάτω.

Έξοδος χρήσης μιας μεταβλητής σε μια ρήτρα WHERE για φιλτράρισμα του GuruΠίνακας 99

Ενδιαφέροντα στοιχεία για τις μεταβλητές του SQL Server!

  • Μια τοπική μεταβλητή μπορεί να εμφανιστεί χρησιμοποιώντας την εντολή PRINT καθώς και την εντολή SELECT.
  • Ο τύπος δεδομένων πίνακα δεν επιτρέπει τη χρήση του 'AS' κατά τη δήλωση.
  • Το SET συμμορφώνεται με τα πρότυπα ANSI, ενώ το SELECT όχι.
  • Επιτρέπεται επίσης η δημιουργία μιας τοπικής μεταβλητής με όνομα @. Για παράδειγμα, μπορεί να δηλωθεί ως:
'DECLARE @@ as VARCHAR (10)'

Συχνές Ερωτήσεις

Αφού εκτελεστεί η DECLARE χωρίς ανάθεση, μια μεταβλητή SQL Server διατηρεί την τιμή NULL. Η μεταβλητή υπάρχει αλλά δεν έχει τιμή μέχρι να την αντιστοιχίσετε χρησιμοποιώντας την DECLARE με =, SET ή SELECT. Η αναφορά της πριν από την ανάθεση απλώς επιστρέφει NULL.

Όταν το υποερώτημα δεν επιστρέφει γραμμές, η συνάρτηση SET αντιστοιχίζει την τιμή NULL και αντικαθιστά οποιαδήποτε τρέχουσα τιμή. Αντίθετα, η συνάρτηση SELECT αφήνει τη μεταβλητή αμετάβλητη, διατηρώνταςping όποια τιμή κι αν είχε ήδη. Αυτή η διαφορά έχει σημασία όταν η μεταβλητή ξεκίνησε με μια τιμή που δεν είναι NULL.

Μια μεταβλητή πίνακα, που δηλώνεται ως DECLARE @t TABLE(…), αποθηκεύει ένα μικρό σύνολο αποτελεσμάτων με πεδίο εφαρμογής μία παρτίδα. Σε αντίθεση με έναν πίνακα #temp, υπάρχει μόνο μέσα στην παρτίδα του, δεν μπορεί να τροποποιηθεί μετά τη δημιουργία του και συχνά είναι κατάλληλη για μικρά σύνολα δεδομένων.

Μια τοπική μεταβλητή περιορίζεται στην παρτίδα, την αποθηκευμένη διαδικασία ή την ενεργοποίηση όπου δηλώνεται, εντός μίας συνεδρίας. Η λέξη-κλειδί GO τερματίζει μια παρτίδα, επομένως μια μεταβλητή που δηλώνεται πριν από την GO δεν μπορεί να αναφερθεί μετά από αυτήν.

Μια μεταβλητή μπορεί να χρησιμοποιήσει σχεδόν οποιοδήποτε SQL Server Τύπος δεδομένων, συμπεριλαμβανομένων των int, decimal, varchar, nvarchar, date, datetime, bit και table. Αντιστοιχίστε τη μεταβλητή με τη στήλη που αντιπροσωπεύει για να αποφύγετε έμμεσα σφάλματα μετατροπής.

Επαναπροσδιορίστε τη μεταβλητή στον εαυτό της με SET, για παράδειγμα SET @counter = @counter + 1. Το SELECT λειτουργεί επίσης: SELECT @total = @total + price. Αυτό το μοτίβο οδηγεί βρόχους και εκτελούμενα σύνολα μέσα σε σενάρια και αποθηκευμένες διαδικασίες.

Ναί. GitHub Copilot μπορεί να δημιουργήσει εντολές DECLARE, SET και SELECT από σχόλια φυσικής γλώσσας και να προτείνει κατάλληλους τύπους δεδομένων. Να ελέγχετε πάντα τα δημιουργημένα ονόματα, τους τύπους και τη λογική ανάθεσης σε σχέση με το σχήμα σας πριν το εκτελέσετε στην παραγωγή.

Βοηθοί Τεχνητής Νοημοσύνης και Μηχανικής Μάθησης tracτον τρόπο με τον οποίο οι μεταβλητές λαμβάνουν και μεταβιβάζουν τιμές, επισημαίνουν μη αρχικοποιημένες ή λανθασμένα πληκτρολογημένες μεταβλητές και προτείνουν επανεγγραφές βάσει συνόλων που αντικαθιστούν τους αργούς βρόχους που καθοδηγούνται από μεταβλητές. Ο προγραμματιστής εξακολουθεί να επιβεβαιώνει κάθε αλλαγή σε σχέση με τα πραγματικά δεδομένα και το φόρτο εργασίας.

Συνοψίστε αυτήν την ανάρτηση με: