변수(Transact-SQL)

적용 대상:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System(PDW)Microsoft Fabric의 SQL 분석 엔드포인트Microsoft Fabric의 Warehouse

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

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

설명

일부 Transact-SQL 시스템 함수의 이름은 두 개의 at 기호(@@)로 시작합니다. 이전 버전의 SQL Server @@ 에서는 함수를 전역 변수라고 하지만 함수 @@ 는 변수가 아니며 변수와 동일한 동작은 없습니다. 함수는 @@ 시스템 함수이며 해당 구문 사용법은 함수에 대한 규칙을 따릅니다.

보기에서는 변수를 사용할 수 없습니다.

변수의 변경 내용은 트랜잭션 롤백의 영향을 받지 않습니다.

Transact-SQL 변수 선언

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

  • 이름 할당 이름은 첫 번째 문자로 단일 @ 이어야 합니다.

  • 시스템 제공 데이터 형식 또는 사용자 정의 데이터 형식 및 길이 할당 숫자 변수의 경우 전체 자릿수와 소수 자릿수도 할당됩니다. XML 형식 변수의 경우 선택적 스키마 컬렉션이 할당될 수 있습니다.

  • 값을 .로 NULL설정합니다.

예를 들어 다음 DECLARE 문은 int 데이터 형식으로 명명된 @mycounter 지역 변수를 만듭니다. 기본적으로 이 변수의 값은 .입니다 NULL.

DECLARE @MyCounter INT;

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

예를 들어 다음 문은 DECLARE 이름이 @StateProvince@LastName@FirstName 3개인 지역 변수를 만들고 각각을 로 NULL초기화합니다.

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

변수의 범위는 변수를 참조할 수 있는 Transact-SQL 문의 범위입니다. 변수의 범위는 선언된 지점부터 선언된 일괄 처리 또는 저장 프로시저의 끝까지 지속됩니다. 예를 들어 다음 스크립트는 변수가 한 일괄 처리(키워드(keyword) 구분 GO )로 선언되고 다른 일괄 처리에서 참조되기 때문에 구문 오류를 생성합니다.

USE AdventureWorks2022;
GO

DECLARE @MyVariable INT;

SET @MyVariable = 1;
GO

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

예시

다음 스크립트는 작은 테스트 테이블을 만들고 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