Variabel (Transact-SQL)

Berlaku untuk:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse Analytics AnalyticsPlatform System (PDW)Titik akhir analitik SQL di Microsoft FabricWarehouse di Microsoft Fabric

Variabel lokal Transact-SQL adalah objek yang dapat menyimpan satu nilai data dari jenis tertentu. Variabel dalam batch dan skrip biasanya digunakan:

  • Sebagai penghitung baik untuk menghitung berapa kali perulangan dilakukan atau untuk mengontrol berapa kali perulangan dilakukan.
  • Untuk menyimpan nilai data yang akan diuji oleh pernyataan kontrol aliran.
  • Untuk menyimpan nilai data yang akan dikembalikan oleh kode pengembalian prosedur tersimpan atau nilai pengembalian fungsi.

Catatan

  • Nama beberapa fungsi sistem Transact-SQL dimulai dengan dua tanda (@@). Meskipun dalam versi SQL Server sebelumnya, @@functions disebut sebagai variabel global, @@functions bukan variabel, dan mereka tidak memiliki perilaku yang sama dengan variabel. @@functions adalah fungsi sistem, dan penggunaan sintaksnya mengikuti aturan untuk fungsi.
  • Anda tidak dapat menggunakan variabel dalam tampilan.
  • Perubahan pada variabel tidak terpengaruh oleh pembatalan transaksi.

Skrip berikut membuat tabel pengujian kecil dan mengisinya dengan 26 baris. Skrip menggunakan variabel untuk melakukan tiga hal:

  • Kontrol berapa banyak baris yang disisipkan dengan mengontrol berapa kali perulangan dijalankan.
  • Berikan nilai yang disisipkan ke dalam kolom bilangan bulat.
  • Fungsi sebagai bagian dari ekspresi yang menghasilkan huruf untuk disisipkan ke dalam kolom karakter.
-- Create the table.
CREATE TABLE TestTable (cola INT, colb CHAR(3));
GO
SET NOCOUNT ON;
GO
-- Declare the variable to be used.
DECLARE @MyCounter INT;

-- Initialize the variable.
SET @MyCounter = 0;

-- Test the variable to see if the loop is finished.
WHILE (@MyCounter < 26)
BEGIN;
   -- Insert a row into the table.
   INSERT INTO TestTable VALUES
       -- Use the variable to provide the integer value
       -- for cola. Also use it to generate a unique letter
       -- for each row. Use the ASCII function to get the
       -- integer value of 'a'. Add @MyCounter. Use CHAR to
       -- convert the sum back to the character @MyCounter
       -- characters after 'a'.
       (@MyCounter,
        CHAR( ( @MyCounter + ASCII('a') ) )
       );
   -- Increment the variable to count this iteration
   -- of the loop.
   SET @MyCounter = @MyCounter + 1;
END;
GO
SET NOCOUNT OFF;
GO
-- View the data.
SELECT cola, colb
FROM TestTable;
GO
DROP TABLE TestTable;
GO

Mendeklarasikan Variabel Transact-SQL

Pernyataan DECLARE menginisialisasi variabel Transact-SQL dengan:

  • Menetapkan nama. Nama harus memiliki satu @ sebagai karakter pertama.
  • Menetapkan jenis data yang disediakan sistem atau ditentukan pengguna dan panjangnya. Untuk variabel numerik, presisi dan skala juga ditetapkan. Untuk variabel jenis XML, koleksi skema opsional dapat ditetapkan.
  • Mengatur nilai ke NULL.

Misalnya, pernyataan DECLARE berikut membuat variabel lokal bernama @mycounter dengan jenis data int.

DECLARE @MyCounter INT;

Untuk mendeklarasikan lebih dari satu variabel lokal, gunakan koma setelah variabel lokal pertama yang ditentukan, lalu tentukan nama variabel lokal dan jenis data berikutnya.

Misalnya, pernyataan DECLARE berikut membuat tiga variabel lokal bernama @LastName, @FirstName dan @StateProvince, dan menginisialisasi masing-masing ke NULL:

DECLARE @LastName NVARCHAR(30), @FirstName NVARCHAR(20), @StateProvince NCHAR(2);

Cakupan variabel adalah rentang pernyataan Transact-SQL yang dapat mereferensikan variabel. Cakupan variabel berlangsung dari titik yang dinyatakan sampai akhir batch atau prosedur tersimpan di mana variabel dideklarasikan. Misalnya, skrip berikut menghasilkan kesalahan sintaks karena variabel dideklarasikan dalam satu batch dan direferensikan di batch lain:

USE AdventureWorks2022;
GO
DECLARE @MyVariable INT;
SET @MyVariable = 1;
-- Terminate the batch by using the GO keyword.
GO 
-- @MyVariable has gone out of scope and no longer exists.

-- This SELECT statement generates a syntax error because it is
-- no longer legal to reference @MyVariable.
SELECT BusinessEntityID, NationalIDNumber, JobTitle
FROM HumanResources.Employee
WHERE BusinessEntityID = @MyVariable;

Variabel memiliki cakupan lokal dan hanya terlihat dalam batch atau prosedur tempat variabel didefinisikan. Dalam contoh berikut, cakupan berlapis yang dibuat untuk eksekusi sp_executesql tidak memiliki akses ke variabel yang dideklarasikan dalam cakupan dan pengembalian dan kesalahan yang lebih tinggi.

DECLARE @MyVariable INT;
SET @MyVariable = 1;
EXECUTE sp_executesql N'SELECT @MyVariable'; -- this produces an error

Mengatur Nilai dalam Variabel T-SQL

Ketika variabel pertama kali dideklarasikan, nilainya diatur ke NULL. Untuk menetapkan nilai ke variabel, gunakan pernyataan SET. Ini adalah metode yang disukai untuk menetapkan nilai ke variabel. Variabel juga dapat memiliki nilai yang ditetapkan dengan direferensikan dalam daftar pilih pernyataan SELECT.

Untuk menetapkan variabel nilai dengan menggunakan pernyataan SET, sertakan nama variabel dan nilai yang akan ditetapkan ke variabel. Ini adalah metode yang disukai untuk menetapkan nilai ke variabel. Batch berikut, misalnya, mendeklarasikan dua variabel, menetapkan nilai kepada mereka, lalu menggunakannya dalam WHERE klausul SELECT pernyataan:

USE AdventureWorks2022;
GO
-- Declare two variables.
DECLARE @FirstNameVariable NVARCHAR(50),
   @PostalCodeVariable NVARCHAR(15);

-- Set their values.
SET @FirstNameVariable = N'Amy';
SET @PostalCodeVariable = N'BA5 3HX';

-- Use them in the WHERE clause of a SELECT statement.
SELECT LastName, FirstName, JobTitle, City, StateProvinceName, CountryRegionName
FROM HumanResources.vEmployee
WHERE FirstName = @FirstNameVariable
   OR PostalCode = @PostalCodeVariable;
GO

Variabel juga dapat memiliki nilai yang ditetapkan dengan direferensikan dalam daftar pilih. Jika variabel direferensikan dalam daftar pilih, variabel harus diberi nilai skalar atau pernyataan SELECT hanya boleh mengembalikan satu baris. Contohnya:

USE AdventureWorks2022;
GO
DECLARE @EmpIDVariable INT;

SELECT @EmpIDVariable = MAX(EmployeeID)
FROM HumanResources.Employee;
GO

Peringatan

Jika ada beberapa klausa penetapan dalam satu pernyataan SELECT, SQL Server tidak menjamin urutan evaluasi ekspresi. Perhatikan bahwa efek hanya terlihat jika ada referensi di antara tugas.

Jika pernyataan SELECT mengembalikan lebih dari satu baris dan variabel mereferensikan ekspresi non-skalar, variabel diatur ke nilai yang dikembalikan untuk ekspresi di baris terakhir dari tataan hasil. Misalnya, dalam @EmpIDVariable batch berikut diatur ke nilai BusinessEntityID dari baris terakhir yang dikembalikan, yaitu 1:

USE AdventureWorks2022;
GO
DECLARE @EmpIDVariable INT;

SELECT @EmpIDVariable = BusinessEntityID
FROM HumanResources.Employee
ORDER BY BusinessEntityID DESC;

SELECT @EmpIDVariable;
GO

Lihat Juga

Declare @local_variable
SET @local_variable
SELECT @local_variable
Ekspresi (Transact-SQL)
Operator Majemuk (Transact-SQL)