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 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.

Keterangan

Nama beberapa fungsi sistem Transact-SQL dimulai dengan dua tanda (@@). Meskipun dalam versi SQL Server sebelumnya, @@ fungsi disebut sebagai variabel global, @@ fungsi bukan variabel, dan tidak memiliki perilaku yang sama dengan variabel. Fungsinya @@ 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.

Mendeklarasikan variabel Transact-SQL

Pernyataan ini 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 mungkin ditetapkan.

  • Mengatur nilai ke NULL.

Misalnya, pernyataan berikut DECLARE membuat variabel lokal bernama @mycounter dengan jenis data int . Secara default, nilai untuk variabel ini adalah NULL.

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 berikut DECLARE 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 hingga akhir batch atau prosedur tersimpan di mana variabel dideklarasikan. Misalnya, skrip berikut menghasilkan kesalahan sintaks karena variabel dideklarasikan dalam satu batch (dipisahkan oleh GO kata kunci) dan direferensikan di yang lain:

USE AdventureWorks2022;
GO

DECLARE @MyVariable INT;

SET @MyVariable = 1;
GO

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 Transact-SQL

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

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 SELECT pernyataan 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 penugasan dalam satu SELECT pernyataan, SQL Server tidak menjamin urutan evaluasi ekspresi. Efek hanya terlihat jika ada referensi di antara penugasan.

SELECT Jika pernyataan mengembalikan lebih dari satu baris dan variabel mereferensikan ekspresi nonskala, variabel diatur ke nilai yang dikembalikan untuk ekspresi di baris terakhir dari tataan hasil. Misalnya, dalam batch @EmpIDVariable berikut diatur ke BusinessEntityID nilai 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

Contoh

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