Transact-SQL Değişkenleri
Transact-SQL yerel değişkeni belirli bir türün tek veri değerini içeren bir nesnedir.Toplu işlerde ve komut dosyalarındaki değişkenler genellikle şu şekilde kullanılır:
Bir döngünün gerçekleştirilme sayısını saymak veya bir döngünün kaç kez gerçekleştirileceğini kontrol etmek için bir sayaç olarak.
Akış denetimli deyimi ile test edilen veri değerini tutmak.
Saklı yordam dönüş kodu veya işlev dönüş değeri ile döndürülen veri değerini kaydetmek.
Not
Bazı Transact-SQL sistem işlevlerinin adları iki (@@) işareti ile başlar.Eski Microsoft SQL Server sürümlerinde, @@işlevleri global değişkenler olarak adlandırılsa da, bunlar değişken değildir ve değişkenlerle aynı davranışlara sahip değildir.@@işlevleri sistem işlevleridir ve sözdizimi kullanımları işlevlere ilişkin kuralları takip eder.
Şu komut dosyası küçük bir test tablosu oluşturur ve bu tabloyu 26 satır olarak çoğaltır.Komut dosyası üç şey gerçekleştirmek için değişken kullanır:
Döngünün kaç kez yürütüldüğünü denetleyerek kaç satır eklendiğini kontrol etme.
Tam sayı sütununa eklenen değeri temin etme.
Karakter sütununa eklenen harfleri oluşturan ifadenin bir parçası olarak işlev görme.
-- 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
Transact-SQL Değişkenini Bildirme
DECLARE deyimi bir Transact-SQL değişkenini şu şekilde başlatır:
Bir ad atayarak.Adda ilk karakter olarak tek bir @ işaretinin olması gerekir.
Sistem tarafından temin edilmiş veya kullanıcı tanımlı veri türünü ve uzunluğunu atayarak.Sayısal değişkenler için duyarlık ve ölçek de atanır.XML türüne ilişkin değişkenler için isteğe bağlı şema koleksiyonu atanabilir.
Değeri NULL olarak ayarlayarak.
Örneğin, şu DECLARE deyimi @mycounter adlı ve int veri türünü içeren yerel bir değişken oluşturur.
DECLARE @MyCounter int;
Birden fazla yerel değişken bildirmek için tanımlanan ilk yerel değişkenden sonra virgül kullanın ve ardından bir sonraki yerel değişken adı ile veri türünü belirtin.
Örneğin şu DECLARE deyimi @LastName, @FirstName ve @StateProvince adlı üç yerel değişken oluşturur ve her birini NULL olarak başlatır:
DECLARE @LastName nvarchar(30), @FirstName nvarchar(20), @StateProvince nchar(2);
Değişken kapsamı değişkene başvurabilecek Transact-SQL deyimi aralığıdır.Bir değişkenin kapsamı bildirildiği noktadan başlayarak bildirildiği toplu iş veya saklı yordamın sonuna dek sürer.Örneğin, şu komut dosyası değişken bir toplu işte bildirildiğinden ve bu değişkene başka bir toplu işte başvurulduğundan şu komut dosyası bir sözdizim hatası oluşturur.
USE AdventureWorks2008R2;
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;
Değişkenler yerel kapsama sahiptir ve yalnızca tanımlandıkları toplu iş veya yordam içinde görünür.Şu örnekte sp_executesql öğesinin yürütülmesi için oluşturulan iç içe kapsam daha yüksek bir kapsamda, iadede ve hatada bildirilen değişken için erişime sahip değildir.
DECLARE @MyVariable int;
SET @MyVariable = 1;
EXECUTE sp_executesql N'SELECT @MyVariable'; -- this produces an error
Transact-SQL Değişkenin Değer Ayarlama
Değişken ilk kez bildirildiğinde, değeri NULL olarak ayarlanır.Bir değişkene değer atamak için SET deyimini kullanın.Bu, bir değişkene değer atamanın tercih edilen yöntemidir.Ayrıca bir değişken SELECT deyiminin seçim listesinden başvurularak atanan bir değere de sahip olabilir.
Bir değişkene SET deyimini kullanarak değer atamak için değişkene atanacak değişken adını ve değeri dahil edin.Bu, bir değişkene değer atamanın tercih edilen yöntemidir.Örneğin şu toplu iş iki değişken bildirir, bu değişkenlere değerler atar ve ardından bu değişkenleri SELECT deyiminin WHERE yan tümcesinde kullanır:
USE AdventureWorks2008R2;
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
Ayrıca bir değişken seçim listesinden başvurularak atanan bir değere de sahip olabilir.Bir değişkene seçim listesinden başvurulursa, değişkenin bir skalar değere atanması veya SELECT deyiminin yalnızca bir satır döndürmesi gerekir.Örneğin:
USE AdventureWorks2008R2;
GO
DECLARE @EmpIDVariable int;
SELECT @EmpIDVariable = MAX(EmployeeID)
FROM HumanResources.Employee;
GO
Dikkat |
---|
Tek bir SELECT deyiminde birden çok atama yan tümcesi varsa, SQL Server deyimlerin değerlendirme sırasını garanti etmez.Etkinin yalnızca atamalar arasında başvurular bulunması durumunda görünür olacağını aklınızda bulundurun. |
SELECT deyimi birden çok satır döndürürse ve değişken skalar olmayan bir deyime başvurursa, değişken sonuç kümesinin son satırındaki ifade için döndürülen değere ayarlanır.Şu @EmpIDVariable toplu işi döndürülen son satırın 1 olan BusinessEntityID değerine ayarlıdır.
USE AdventureWorks2008R2;
GO
DECLARE @EmpIDVariable int;
SELECT @EmpIDVariable = BusinessEntityID
FROM HumanResources.Employee
ORDER BY BusinessEntityID DESC;
SELECT @EmpIDVariable;
GO