변수(Transact-SQL)

적용 대상: Microsoft Fabric의 Microsoft FabricWarehouse에 있는 SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsPlatform System(PDW) SQL 분석 엔드포인트

Transact-SQL 지역 변수는 특정 유형의 단일 데이터 값을 보유할 수 있는 개체입니다. 일괄 처리 및 스크립트의 변수는 일반적으로 사용됩니다.

  • 카운터로서 루프가 수행되는 횟수를 계산하거나 루프가 수행되는 횟수를 제어합니다.
  • 흐름 제어 문에서 테스트할 데이터 값을 저장합니다.
  • 저장 프로시저에서 반환할 데이터 값을 저장하려면 코드 또는 함수 반환 값을 반환합니다.

참고 항목

  • 일부 Transact-SQL 시스템 함수의 이름은 두 개의 기호(@@)로 시작합니다. 이전 버전의 SQL Server에서는 @@함수가 전역 변수로 참조되지만 @@함수는 변수가 아니며 변수와 동일하게 동작하지 않습니다. @@functions 시스템 함수이며 해당 구문 사용법은 함수에 대한 규칙을 따릅니다.
  • 보기에서는 변수를 사용할 수 없습니다.
  • 변수의 변경 내용은 트랜잭션 롤백의 영향을 받지 않습니다.

다음 스크립트는 작은 테스트 테이블을 만들고 26개의 행으로 채웁니다. 스크립트는 변수를 사용하여 다음 세 가지 작업을 수행합니다.

  • 루프가 실행되는 횟수를 제어하여 삽입되는 행 수를 제어합니다.
  • 정수 열에 삽입된 값을 제공합니다.
  • 문자 열에 삽입할 문자를 생성하는 식의 일부로 작동합니다.
-- 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 변수 선언

DECLARE 문은 다음을 통해 Transact-SQL 변수를 초기화합니다.

  • 이름 할당 이름에는 첫 번째 문자로 @가 하나 있어야 합니다.
  • 시스템 제공 데이터 형식 또는 사용자 정의 데이터 형식 및 길이 할당 숫자 변수의 경우 전체 자릿수와 소수 자릿수도 할당됩니다. XML 형식 변수의 경우 선택적 스키마 컬렉션을 할당할 수 있습니다.
  • 값을 NULL로 설정

예를 들어 다음 DECLARE 문은 int 데이터 형식의 @mycounter라는 지역 변수를 만듭니다.

DECLARE @MyCounter INT;

둘 이상의 지역 변수를 선언하려면 정의된 첫 지역 변수 다음에 쉼표를 사용한 후 다음 지역 변수의 이름 및 데이터 형식을 지정합니다.

예를 들어 다음 DECLARE 문은 @LastName, @FirstName@StateProvince의 세 지역 변수를 만들고 각각 NULL로 초기화합니다.

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

변수의 범위는 변수를 참조할 수 있는 Transact-SQL 문의 범위입니다. 변수의 범위는 선언된 시점부터 선언된 일괄 처리 또는 저장 프로시저의 끝까지 지속됩니다. 예를 들어 다음 스크립트는 변수가 하나의 일괄 처리에서 선언되고 또 다른 일괄 처리에서 참조되므로 구문 오류를 일으킵니다.

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;

변수에는 변수가 정의된 일괄 처리 또는 프로시저 내에서만 표시되는 로컬 범위가 있습니다. 다음 예제에서 sp_executesql 실행을 위해 만든 중첩된 범위는 더 높은 범위에서 선언된 변수에 액세스할 수 없으며 반환 및 오류가 발생합니다.

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

Transact-SQL 변수의 값 설정

변수가 처음 선언되면 해당 값은 NULL로 설정됩니다. 변수에 값을 할당하려면 SET 문을 사용합니다. 변수에 값을 할당하는 기본 방법입니다. 변수는 SELECT 문의 선택 목록에서 참조되어 할당된 값을 가질 수도 있습니다.

SET 문을 사용하여 변수에 값을 할당하려면 변수 이름과 변수에 할당할 값을 포함합니다. 변수에 값을 할당하는 기본 방법입니다. 예를 들어 다음 일괄 처리는 두 개의 변수를 선언하고 값을 할당한 다음 문 절 SELECT 에서 WHERE 사용합니다.

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

변수는 선택 목록에서 참조되어 할당된 값을 가질 수도 있습니다. 선택 목록에서 변수를 참조하는 경우 스칼라 값이 할당되거나 SELECT 문은 한 행만 반환해야 합니다. 예시:

USE AdventureWorks2022;
GO
DECLARE @EmpIDVariable INT;

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

Warning

단일 SELECT 문에 할당 절이 여러 개 있는 경우 SQL Server는 식의 평가 순서를 보장하지 않습니다. 할당 간에 참조가 있을 경우에만 그 결과가 표시됩니다.

SELECT 문이 둘 이상의 행을 반환하고 변수가 스칼라가 아닌 식을 참조하는 경우 변수는 결과 집합의 마지막 행에 있는 식에 대해 반환되는 값으로 설정됩니다. 예를 들어 다음 일괄 처리에서 EmpIDVariable은 반환된 마지막 행의 BusinessEntityID 값인 1로 설정됩니다.

USE AdventureWorks2022;
GO
DECLARE @EmpIDVariable INT;

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

SELECT @EmpIDVariable;
GO

참고 항목

Declare @local_variable
SET @local_variable
SELECT @local_variable
식(Transact-SQL)
복합 연산자(Transact-SQL)