EXECUTE(Transact-SQL)
업데이트: 2007년 9월 15일
Transact-SQL 일괄 처리 내에서 또는 시스템 저장 프로시저, 사용자 정의 저장 프로시저, 스칼라 값 사용자 정의 함수 또는 확장 저장 프로시저와 같은 모듈에서 문자열이나 명령 문자열을 실행합니다.
보안 정보: |
---|
문자열을 사용하여 EXECUTE를 호출하려면 먼저 문자열의 유효성을 검사해야 합니다. 유효성을 검사하지 않은 사용자 입력으로 생성된 명령은 실행하지 마십시오. 자세한 내용은 SQL 인젝션을 참조하십시오. |
SQL Server 2005에서는 EXECUTE 문을 확장하여 연결된 서버로 통과 명령을 보내는 데 사용할 수 있습니다. 또한 문자열이나 명령이 실행되는 컨텍스트를 명시적으로 설정할 수도 있습니다.
구문
Execute a stored procedure or function
[ { EXEC | EXECUTE } ]
{
[ @return_status = ]
{ module_name [ ;number ] | @module_name_var }
[ [ @parameter = ] { value
| @variable [ OUTPUT ]
| [ DEFAULT ]
}
]
[ ,...n ]
[ WITH RECOMPILE ]
}
[;]
Execute a character string
{ EXEC | EXECUTE }
( { @string_variable | [ N ]'tsql_string' } [ + ...n ] )
[ AS { LOGIN | USER } = ' name ' ]
[;]
Execute a pass-through command against a linked server
{ EXEC | EXECUTE }
( { @string_variable | [ N ] 'command_string [ ? ] ' } [ + ...n ]
[ { , { value | @variable [ OUTPUT ] } } [ ...n ] ]
)
[ AS { LOGIN | USER } = ' name ' ]
[ AT linked_server_name ]
[;]
인수
**@**return_status
모듈의 반환 상태를 저장하는 선택적 정수 변수입니다. EXECUTE 문에서 이 변수를 사용하려면 먼저 일괄 처리, 저장 프로시저 또는 함수에서 변수를 선언해야 합니다.스칼라 값 사용자 정의 함수를 호출하는 데 사용하는 경우에는 모든 스칼라 데이터 형식을 **@**return_status 변수로 사용할 수 있습니다.
module_name
호출할 저장 프로시저나 스칼라 값 사용자 정의 함수의 정규화되거나 정규화되지 않은 이름입니다. 모듈 이름은 식별자 규칙을 따라야 합니다. 확장 저장 프로시저의 이름은 서버의 데이터 정렬에 관계없이 항상 대/소문자를 구분합니다.다른 데이터베이스에서 생성된 모듈은 이 모듈을 실행하는 사용자가 모듈을 소유하고 있거나 해당 데이터베이스에서 모듈을 실행할 수 있는 적절한 사용 권한이 있는 경우에 실행될 수 있습니다. SQL Server를 실행하고 있는 다른 서버에서 모듈을 실행하려면 모듈을 실행하는 사용자가 원격 액세스를 통해 서버에 연결하여 해당 데이터베이스에서 모듈을 실행할 수 있는 적절한 사용 권한을 갖고 있어야 합니다. 서버 이름은 지정했지만 데이터베이스 이름은 지정하지 않은 경우 SQL Server 2005 데이터베이스 엔진은 사용자의 기본 데이터베이스에서 모듈을 찾습니다.
**;**number
같은 이름의 프로시저를 그룹화하는 데 사용하는 정수입니다(선택 사항). 이 매개 변수는 확장 저장 프로시저에는 사용하지 않습니다.[!참고] Microsoft SQL Server의 이후 버전에서는 이 기능이 제거됩니다. 새 개발 작업에서는 이 기능을 사용하지 말고, 현재 이 기능을 사용하는 응용 프로그램은 수정하십시오.
프로시저 그룹에 대한 자세한 내용은 CREATE PROCEDURE(Transact-SQL)를 참조하십시오.
- **@**module_name_var
로컬로 정의된 변수 이름이며 모듈 이름을 나타냅니다.
@parameter
module_name에 대한 매개 변수이며 모듈에서 정의됩니다. 매개 변수 이름 앞에는 반드시 at 기호(@)를 사용해야 합니다. **@**parameter_name=value 형식을 사용하는 경우에는 매개 변수 이름과 상수를 모듈에서 정의된 순서대로 제공하지 않아도 됩니다. 그러나 임의의 매개 변수에 **@**parameter_name=value 형식을 사용한 경우에는 이후에 사용할 모든 매개 변수에도 이 형식을 사용해야 합니다.기본적으로 매개 변수는 Null이 허용됩니다. NULL 매개 변수 값이 전달되고, 참조되는 열이 Null 값을 허용하지 않는 CREATE TABLE 또는 ALTER TABLE 문에 해당 매개 변수가 사용되는 경우(예: Null 값을 허용하지 않는 열에 삽입하는 경우) 데이터베이스 엔진에서 오류가 발생합니다. Null 값을 허용하지 않는 열에 Null 매개 변수 값이 전달되지 않게 하려면 모듈에 프로그래밍 논리를 추가하거나 CREATE TABLE 또는 ALTER TABLE의 DEFAULT 키워드를 사용하여 열의 기본값을 사용합니다.
value
모듈이나 통과 명령에 전달할 매개 변수 값입니다. 매개 변수 이름을 지정하지 않은 경우에는 모듈에 정의된 순서대로 매개 변수 값을 제공해야 합니다.연결된 서버에 대해 통과 명령을 실행하는 경우 연결된 서버의 OLE DB 공급자에 따라 매개 변수 값의 순서가 달라집니다. 대부분의 OLE DB 공급자는 왼쪽에서 오른쪽으로 값을 매개 변수에 바인딩합니다.
매개 변수 값이 개체 이름이거나 문자열인 경우 또는 데이터베이스 이름이나 스키마 이름으로 한정되는 경우에는 반드시 전체 이름을 작은따옴표로 묶어야 합니다. 매개 변수 값이 키워드인 경우에는 반드시 큰따옴표로 키워드를 묶어야 합니다.
모듈에 기본값이 정의되어 있는 경우에는 매개 변수를 지정하지 않고도 모듈을 실행할 수 있습니다.
기본값으로 NULL을 사용할 수도 있습니다. 일반적으로 모듈 정의는 매개 변수 값이 NULL일 때 수행할 작업을 지정합니다.
- **@**variable
매개 변수를 저장하거나 반환하는 변수입니다.
OUTPUT
모듈이나 명령 문자열에서 매개 변수를 반환하도록 지정합니다. 모듈이나 명령 문자열에서 일치하는 매개 변수가 반드시 OUTPUT 키워드를 사용하여 생성되어 있어야 합니다. 커서 변수를 매개 변수로 사용할 때 이 키워드를 사용합니다.value 가 연결된 서버에 대해 실행되는 모듈의 OUTPUT으로 정의된 경우 OLE DB 공급자가 해당 **@**parameter에 수행한 모든 변경 내용은 모듈 실행이 끝날 때 변수로 다시 복사됩니다.
OUTPUT 매개 변수를 사용하고 있거나 호출 일괄 처리 또는 모듈 내의 다른 문에서 반환 값을 사용하려는 경우에는 매개 변수 값을 **@**parameter = **@**variable과 같은 형식의 변수로 전달해야 합니다. 모듈에서 OUTPUT 매개 변수로 정의되지 않은 매개 변수에 대해 OUTPUT을 지정하여 모듈을 실행할 수는 없습니다. 상수는 OUTPUT을 사용하여 모듈에 전달할 수 없습니다. 반환 매개 변수에는 변수 이름이 필요합니다. 프로시저를 실행하기 전에 변수의 데이터 형식이 선언되어야 하며 값이 할당되어야 합니다.
EXECUTE를 원격 저장 프로시저에 사용하거나 연결된 서버에 대해 통과 명령을 실행하는 데 사용하는 경우 OUTPUT 매개 변수에는 LOB(Large Object) 데이터 형식을 사용할 수 없습니다.
반환 매개 변수에는 LOB 데이터 형식을 제외한 모든 데이터 형식을 사용할 수 있습니다.
- DEFAULT
모듈에 정의된 매개 변수의 기본값을 제공합니다. 정의된 기본값이 없는 매개 변수 값이 모듈에 필요하고 매개 변수가 손실되었거나 DEFAULT 키워드가 지정된 경우에는 오류가 발생합니다.
WITH RECOMPILE
모듈을 실행한 후 새 계획을 컴파일하고 사용한 다음 삭제하도록 합니다. 모듈에 대한 기존 쿼리 계획이 있는 경우 이 계획은 캐시에 유지됩니다.제공하는 매개 변수가 불규칙하거나 데이터가 현저하게 변경된 경우에 이 옵션을 사용합니다. 이 옵션은 확장 저장 프로시저에는 사용하지 않습니다. 이 옵션은 비용이 많이 들기 때문에 반드시 필요한 경우에만 사용하는 것이 좋습니다.
[!참고] OPENDATASOURCE 구문을 사용하는 저장 프로시저를 호출할 때는 WITH RECOMPILE을 사용할 수 없습니다. 네 부분으로 된 개체 이름이 지정된 경우 WITH RECOMPILE 옵션은 무시됩니다.
- **@**string_variable
로컬 변수의 이름입니다. **@**string_variable에는 char, varchar, nchar 또는 nvarchar 데이터 형식을 사용할 수 있습니다. 여기에는 (max) 데이터 형식이 포함됩니다.
- [N] 'tsql_string'
상수 문자열입니다. tsql_string에는 nvarchar 또는 varchar 데이터 형식을 사용할 수 있습니다. N을 포함하면 문자열이 nvarchar 데이터 형식으로 해석됩니다.
- AS <context_specification>
문이 실행될 컨텍스트를 지정합니다. 자세한 내용은 실행 컨텍스트 이해를 참조하십시오.
- LOGIN
가장할 컨텍스트를 로그인으로 지정합니다. 가장의 범위는 서버입니다.
USER
가장할 컨텍스트를 현재 데이터베이스의 사용자로 지정합니다. 가장의 범위는 현재 데이터베이스로 제한됩니다. 데이터베이스 사용자로 컨텍스트 전환 시 해당 사용자의 서버 수준 사용 권한은 상속되지 않습니다.중요: 데이터베이스 사용자로의 컨텍스트 전환이 활성 상태인 경우 데이터베이스 외부에 있는 리소스에 액세스하려고 시도하면 문이 실행되지 않습니다. 이러한 문에는 USE database 문, 분산 쿼리, 그리고 세 부분이나 네 부분으로 된 식별자를 사용하여 다른 데이터베이스를 참조하는 쿼리가 포함됩니다. 컨텍스트 전환 범위를 현재 데이터베이스 외부로 확장하려면 EXECUTE AS를 사용하여 데이터베이스 가장 확장을 참조하십시오.
'name'
유효한 사용자 또는 로그인 이름입니다. name은 sysadmin 고정 서버 역할의 멤버이거나 sys.database_principals 또는 sys.server_principals에서 보안 주체로 존재해야 합니다.name에는 NT AUTHORITY\LocalService, NT AUTHORITY\NetworkService 또는 NT AUTHORITY\LocalSystem과 같은 기본 제공 계정을 사용할 수 없습니다.
자세한 내용은 이 항목의 뒤에 나오는 사용자 또는 로그인 이름 지정을 참조하십시오.
- [N] 'command_string'
연결된 서버로 전달될 명령을 포함하는 상수 문자열입니다. N을 포함하면 문자열이 nvarchar 데이터 형식으로 해석됩니다.
- [?]
EXEC('…', <arg-list>) AT <linkedsrv> 문에 사용되는 통과 명령의 <arg-list>에 값을 제공할 매개 변수를 나타냅니다.
- AT linked_server_name
command_string을 linked_server_name에 대해 실행하고 결과가 있는 경우 클라이언트로 반환하도록 지정합니다. linked_server_name은 로컬 서버의 기존 연결된 서버 정의를 참조해야 합니다. 연결된 서버는 sp_addlinkedserver를 사용하여 정의합니다.
주의
매개 변수는 *value.*를 사용하거나 **@parameter_name=**value를 사용하여 제공할 수 있습니다. 매개 변수는 트랜잭션의 일부가 아니므로 나중에 롤백되는 트랜잭션에서 매개 변수가 변경된 경우 해당 매개 변수의 값은 이전 값으로 되돌아가지 않습니다. 호출자에게 반환되는 값은 항상 모듈이 반환되는 시점의 값입니다.
한 모듈에서 다른 모듈을 호출하거나 CLR(공용 언어 런타임) 모듈, 사용자 정의 유형 또는 집계를 참조하여 관리 코드를 실행하면 중첩이 발생합니다. 호출된 모듈이나 관리 코드 참조가 실행될 때는 중첩 수준이 증가하고 호출된 모듈이나 관리 코드 참조가 끝날 때는 중첩 수준이 감소합니다. 최대값인 32 중첩 수준을 초과하면 전체 호출 체인이 실행되지 않습니다. 현재 중첩 수준은 @@NESTLEVEL 시스템 함수에 저장됩니다.
BEGIN DISTRIBUTED TRANSACTION 문에서 실행되지 않았거나 다양한 구성 옵션과 함께 사용되는 경우 원격 저장 프로시저와 확장 저장 프로시저는 트랜잭션의 범위 밖에 있으므로 호출을 통해 실행되는 명령은 롤백할 수 없습니다. 자세한 내용은 시스템 저장 프로시저(Transact-SQL) 및 BEGIN DISTRIBUTED TRANSACTION(Transact-SQL)을 참조하십시오.
커서 변수를 사용할 때 변수에 할당된 커서와 함께 커서 변수에서 전달되는 프로시저를 실행하면 오류가 발생합니다.
문이 일괄 처리의 첫 번째 문인 경우에는 모듈을 실행할 때 EXECUTE 키워드를 지정할 필요가 없습니다.
저장 프로시저와 함께 EXECUTE 사용
문이 일괄 처리의 첫 번째 문인 경우에는 저장 프로시저를 실행할 때 EXECUTE 키워드를 지정할 필요가 없습니다.
SQL Server 시스템 저장 프로시저는 **sp_**로 시작합니다. 시스템 저장 프로시저는 물리적으로 리소스 데이터베이스에 저장되지만 논리적으로는 모든 시스템 정의 데이터베이스와 사용자 정의 데이터베이스의 sys 스키마에 나타납니다. 시스템 저장 프로시저를 일괄 처리에서 실행하거나 사용자 정의 저장 프로시저 또는 함수와 같은 모듈 내에서 실행할 때는 저장 프로시저 이름을 sys 스키마 이름으로 한정하는 것이 좋습니다.
SQL Server 시스템 확장 저장 프로시저는 **xp_**로 시작하며 master 데이터베이스의 dbo 스키마에 들어 있습니다. 시스템 확장 저장 프로시저를 일괄 처리에서 실행하거나 사용자 정의 저장 프로시저 또는 함수와 같은 모듈 내에서 실행할 때는 저장 프로시저 이름을 master.dbo로 한정하는 것이 좋습니다.
사용자 정의 저장 프로시저를 일괄 처리에서 실행하거나 사용자 정의 저장 프로시저 또는 함수와 같은 모듈 내에서 실행할 때는 저장 프로시저 이름을 스키마 이름으로 한정하는 것이 좋습니다. 사용자 정의 저장 프로시저의 이름은 시스템 저장 프로시저의 이름과 다르게 지정하는 것이 좋습니다. 저장 프로시저 실행 방법은 저장 프로시저 실행(데이터베이스 엔진)을 참조하십시오.
문자열과 함께 EXECUTE 사용
이전 버전의 SQL Server에서는 문자열이 8,000바이트로 제한됩니다. 따라서 동적 실행을 위해서는 긴 문자열을 연결해야 합니다. 그러나 SQL Server 2005에서는 문자열에 최대 2GB의 데이터를 사용할 수 있는 varchar(max) 및 nvarchar(max) 데이터 형식을 지정할 수 있습니다.
데이터베이스 컨텍스트 내의 변경 사항은 EXECUTE 문이 종료될 때까지만 지속됩니다. 예를 들어 다음 문의 EXEC
가 실행된 후의 데이터베이스 컨텍스트는 master입니다.
USE master; EXEC ('USE AdventureWorks; SELECT EmployeeID, Title FROM HumanResources.Employee;');
컨텍스트 전환
AS { LOGIN | USER } = ' name '
절을 사용하여 동적 문의 실행 컨텍스트를 전환할 수 있습니다. 컨텍스트 전환이 EXECUTE ('string') AS <context_specification>
으로 지정된 경우 컨텍스트 전환 기간은 실행될 쿼리의 범위로 제한됩니다. 자세한 내용은 컨텍스트 전환 이해를 참조하십시오.
사용자 또는 로그인 이름 지정
AS { LOGIN | USER } = ' name '
에 지정된 사용자 또는 로그인 이름은 각각 sys.database_principals 또는 sys.server_principals에서 보안 주체로 존재해야 합니다. 그렇지 않으면 문이 실행되지 않습니다. 또한 보안 주체에 IMPERSONATE 권한을 부여해야 합니다. 호출자가 데이터베이스 소유자가 아니거나 sysadmin 고정 서버 역할의 멤버가 아니라면 사용자가 Windows 그룹 멤버 자격을 통해 SQL Server의 데이터베이스 또는 인스턴스에 액세스하는 경우에도 반드시 보안 주체가 존재해야 합니다. 예를 들어 다음과 같은 조건을 가정해 보십시오.
- CompanyDomain\SQLUsers 그룹에 Sales 데이터베이스에 대한 액세스 권한이 있습니다.
- CompanyDomain\SqlUser1은 SQLUsers의 멤버이므로 Sales 데이터베이스에 대한 암시적 액세스 권한이 있습니다.
CompanyDomain\SqlUser1은 SQLUsers 그룹의 멤버 자격을 통해 데이터베이스에 액세스할 수 있지만 CompanyDomain\SqlUser1
이 데이터베이스의 보안 주체로 존재하지 않기 때문에 EXECUTE @string_variable AS USER = 'CompanyDomain\SqlUser1'
문은 실행되지 않습니다.
최상의 방법
문이나 모듈에 정의된 작업을 수행하는 데 필요한 최소한의 권한이 있는 로그인이나 사용자를 지정합니다. 예를 들어 데이터베이스 수준 권한만 있어도 되는 경우에는 서버 수준 권한이 있는 로그인 이름을 지정하지 마십시오. 마찬가지로 데이터베이스 소유자 권한이 필요한 경우가 아니라면 데이터베이스 소유자 계정을 지정하지 마십시오.
사용 권한
EXECUTE 문을 실행하는 데에는 사용 권한이 필요하지 않습니다. 그러나 EXECUTE 문자열 내에서 참조되는 보안 개체에 대해서는 사용 권한이 필요합니다. 예를 들어 문자열에 INSERT 문이 있는 경우 EXECUTE 문의 호출자에게는 대상 테이블에 대한 INSERT 권한이 있어야 합니다. EXECUTE 문이 모듈 내에 포함된 경우에도 EXECUTE 문이 실행될 때는 사용 권한 검사가 수행됩니다.
모듈에 대한 EXECUTE 권한은 기본적으로 모듈 소유자에게 부여되며 모듈 소유자는 이 권한을 다른 사용자에게 이전할 수 있습니다. 문자열을 실행하는 모듈이 실행될 때는 모듈을 만든 사용자의 컨텍스트가 아니라 모듈을 실행하는 사용자의 컨텍스트에서 사용 권한 검사가 수행됩니다. 그러나 동일한 사용자가 호출 모듈과 호출되는 모듈을 모두 소유하는 경우 두 번째 모듈에 대해서는 EXECUTE 권한 검사가 수행되지 않습니다. 자세한 내용은 소유권 체인을 참조하십시오.
모듈에서 다른 데이터베이스 개체에 액세스하는 경우 사용자에게 모듈에 대한 EXECUTE 권한이 있고 다음 조건 중 하나가 충족된다면 성공적으로 실행됩니다.
- 모듈이 EXECUTE AS USER 또는 SELF로 표시되어 있으며 모듈 소유자가 참조된 개체에 대한 해당 권한을 갖고 있습니다.
- 모듈이 EXECUTE AS CALLER로 표시되어 있으며 사용자가 개체에 대한 해당 권한을 갖고 있습니다.
- 모듈이 EXECUTE AS user_name으로 표시되어 있으며 user_name이 개체에 대한 해당 권한을 갖고 있습니다.
컨텍스트 전환 권한
로그인에 EXECUTE AS를 지정하려면 호출자는 지정한 로그인 이름에 대한 IMPERSONATE 권한을 갖고 있어야 합니다. 데이터베이스 사용자에 EXECUTE AS를 지정하려면 호출자는 지정한 사용자 이름에 대한 IMPERSONATE 권한을 갖고 있어야 합니다. 실행 컨텍스트를 지정하지 않거나 EXECUTE AS CALLER를 지정한 경우에는 IMPERSONATE 권한이 필요하지 않습니다.
예
1. EXECUTE를 사용하여 단일 매개 변수 전달
uspGetEmployeeManagers
저장 프로시저에는 매개 변수 하나(@EmployeeID
)가 필요합니다. 다음 예에서는 매개 변수 값으로 Employee ID 6
을 사용하여 uspGetEmployeeManagers
저장 프로시저를 실행합니다.
USE AdventureWorks;
GO
EXEC dbo.uspGetEmployeeManagers 6;
GO
변수는 실행 시 명시적으로 명명될 수 있습니다.
EXEC dbo.uspGetEmployeeManagers @EmployeeID = 6;
GO
다음 문이 일괄 처리 또는 osql이나 sqlcmd 스크립트의 첫 번째 문인 경우에는 EXEC가 필요하지 않습니다.
dbo.uspGetEmployeeManagers 6;
GO
--Or
dbo.uspGetEmployeeManagers @EmployeeID = 6;
GO
2. 여러 매개 변수 사용
다음 예에서는 spGetWhereUsedProductID
저장 프로시저를 실행합니다. 이 저장 프로시저는 두 개의 매개 변수를 전달합니다. 첫 번째 매개 변수는 제품 ID(819
)이고 두 번째 매개 변수인 @CheckDate,
는 datetime 값입니다.
USE AdventureWorks;
GO
DECLARE @CheckDate datetime;
SET @CheckDate = GETDATE();
EXEC dbo.uspGetWhereUsedProductID 819, @CheckDate;
GO
3. 변수와 함께 EXECUTE 'tsql_string' 사용
다음 예에서는 EXECUTE가 변수가 포함된 동적으로 작성된 문자열을 처리하는 방법을 보여 줍니다. 이 예에서는 AdventureWorks
데이터베이스에 있는 모든 사용자 정의 테이블의 목록을 유지하는 tables_cursor
커서를 만든 다음 해당 목록을 사용하여 테이블의 모든 인덱스를 다시 작성합니다.
USE AdventureWorks;
GO
DECLARE tables_cursor CURSOR
FOR
SELECT s.name, t.name
FROM sys.objects AS t
JOIN sys.schemas AS s ON s.schema_id = t.schema_id
WHERE t.type = 'U';
OPEN tables_cursor;
DECLARE @schemaname sysname;
DECLARE @tablename sysname;
FETCH NEXT FROM tables_cursor INTO @schemaname, @tablename;
WHILE (@@FETCH_STATUS <> -1)
BEGIN;
EXEC ('ALTER INDEX ALL ON ' + @schemaname + '.' + @tablename + ' REBUILD;');
FETCH NEXT FROM tables_cursor INTO @schemaname, @tablename;
END;
PRINT 'The indexes on all tables have been rebuilt.';
CLOSE tables_cursor;
DEALLOCATE tables_cursor;
GO
4. 원격 저장 프로시저와 함께 EXECUTE 사용
다음 예에서는 SQLSERVER1
원격 서버에서 uspGetEmployeeManagers
저장 프로시저를 실행하고 성공이나 실패를 나타내는 반환 상태를 @retstat
에 저장합니다.
DECLARE @retstat int;
EXECUTE @retstat = SQLSERVER1.AdventureWorks.dbo.uspGetEmployeeManagers @EmployeeID = 6;
5. 저장 프로시저 변수와 함께 EXECUTE 사용
다음 예에서는 저장 프로시저 이름을 나타내는 변수를 만듭니다.
DECLARE @proc_name varchar(30);
SET @proc_name = 'sys.sp_who';
EXEC @proc_name;
6. DEFAULT와 함께 EXECUTE 사용
다음 예에서는 첫 번째 및 세 번째 매개 변수에 대한 기본값으로 저장 프로시저를 만듭니다. 프로시저가 실행될 때 호출에 값이 전달되지 않거나 기본값이 지정되는 경우 이러한 기본값은 첫 번째 및 세 번째 매개 변수용으로 삽입됩니다. DEFAULT
키워드를 사용할 수 있는 여러 가지 방법이 있습니다.
USE AdventureWorks;
GO
IF OBJECT_ID(N'dbo.ProcTestDefaults', N'P')IS NOT NULL
DROP PROCEDURE dbo.ProcTestDefaults;
GO
-- Create the stored procedure.
CREATE PROCEDURE dbo.ProcTestDefaults (
@p1 smallint = 42,
@p2 char(1),
@p3 varchar(8) = 'CAR')
AS
SET NOCOUNT ON;
SELECT @p1, @p2, @p3
;
GO
Proc_Test_Defaults
저장 프로시저는 여러 가지 조합으로 실행할 수 있습니다.
-- Specifying a value only for one parameter (@p2).
EXECUTE dbo.ProcTestDefaults @p2 = 'A';
-- Specifying a value for the first two parameters.
EXECUTE dbo.ProcTestDefaults 68, 'B';
-- Specifying a value for all three parameters.
EXECUTE dbo.ProcTestDefaults 68, 'C', 'House';
-- Using the DEFAULT keyword for the first parameter.
EXECUTE dbo.ProcTestDefaults @p1 = DEFAULT, @p2 = 'D';
-- Specifying the parameters in an order different from the order defined in the procedure.
EXECUTE dbo.ProcTestDefaults DEFAULT, @p3 = 'Local', @p2 = 'E';
-- Using the DEFAULT keyword for the first and third parameters.
EXECUTE dbo.ProcTestDefaults DEFAULT, 'H', DEFAULT;
EXECUTE dbo.ProcTestDefaults DEFAULT, 'I', @p3 = DEFAULT;
7. AT linked_server_name과 함께 EXECUTE 사용
다음 예에서는 원격 서버에 명령 문자열을 전달하고 SQL Server의 다른 인스턴스를 가리키는 SeattleSales
연결된 서버를 만든 다음 이 연결된 서버에 대해 DDL 문(CREATE TABLE
)을 실행합니다.
EXEC sp_addlinkedserver 'SeattleSales', 'SQL Server'
GO
EXECUTE ( 'CREATE TABLE AdventureWorks.dbo.SalesTbl
(SalesID int, SalesName varchar(10)) ; ' ) AT SeattleSales;
GO
8. EXECUTE WITH RECOMPILE 사용
다음 예에서는 Proc
_Test
_Defaults
저장 프로시저를 실행하고 모듈을 실행한 후 새 쿼리 계획을 컴파일하고 사용한 다음 삭제하도록 합니다.
EXECUTE dbo.Proc_Test_Defaults @p2 = 'A' WITH RECOMPILE;
GO
9. 사용자 정의 함수와 함께 EXECUTE 사용
다음 예에서는 ufnGetSalesOrderStatusText
스칼라 사용자 정의 함수를 실행합니다. 이 예에서는 @returnstatus
변수를 사용하여 함수가 반환하는 값을 저장합니다. 함수에는 입력 매개 변수 하나(@Status
)가 필요합니다. 이 매개 변수는 tinyint 데이터 형식으로 정의됩니다.
USE AdventureWorks;
GO
DECLARE @returnstatus nvarchar(15);
SET @returnstatus = NULL;
EXEC @returnstatus = dbo.ufnGetSalesOrderStatusText @Status = 2;
PRINT @returnstatus;
GO
10. EXECUTE를 사용하여 연결된 서버의 Oracle 데이터베이스 쿼리
다음 예에서는 원격 Oracle 서버에서 몇 가지 SELECT
문을 실행합니다. 먼저 Oracle 서버를 연결된 서버로 추가한 다음 연결된 서버 로그인을 만듭니다.
-- Setup the linked server.
EXEC sp_addlinkedserver
@server='ORACLE',
@srvproduct='Oracle',
@provider='OraOLEDB.Oracle',
@datasrc='ORACLE10';
EXEC sp_addlinkedsrvlogin
@rmtsrvname='ORACLE',
@useself='false',
@locallogin=null,
@rmtuser='scott',
@rmtpassword='tiger';
EXEC sp_serveroption 'ORACLE', 'rpc out', true;
GO
-- Execute several statements on the linked Oracle server.
EXEC ( 'SELECT * FROM scott.emp') AT ORACLE;
GO
EXEC ( 'SELECT * FROM scott.emp WHERE MGR = ?', 7902) AT ORACLE;
GO
DECLARE @v INT;
SET @v = 7902;
EXEC ( 'SELECT * FROM scott.emp WHERE MGR = ?', @v) AT ORACLE;
GO
11. EXECUTE AS USER를 사용하여 다른 사용자 컨텍스트로 전환
다음 예에서는 테이블을 만들고 AS USER
절을 지정하여 문의 실행 컨텍스트를 호출자에서 User1
로 전환하는 Transact-SQL 문자열을 실행합니다. 데이터베이스 엔진에서는 문이 실행될 때 User1
의 사용 권한을 확인합니다. User1
은 데이터베이스에 사용자로 존재해야 하며 Sales
스키마에서 테이블을 만들 수 있는 사용 권한이 있어야 합니다. 그렇지 않으면 문이 실행되지 않습니다.
USE AdventureWorks;
GO
EXECUTE ('CREATE TABLE Sales.SalesTable (SalesID int, SalesName varchar(10));')
AS USER = 'User1';
GO
12. EXECUTE 및 AT linked_server_name과 함께 매개 변수 사용
다음 예에서는 매개 변수에 물음표(?
) 자리 표시자를 사용하여 원격 서버로 명령 문자열을 전달합니다. SQL Server의 다른 인스턴스를 가리키는 SeattleSales
연결된 서버를 만든 다음 이 연결된 서버에 대해 SELECT
문을 실행합니다. SELECT
문은 물음표를 ProductID
매개 변수(952
)에 대한 자리 표시자로 사용합니다. 이 매개 변수는 문 다음에 입력합니다.
-- Setup the linked server.
EXEC sp_addlinkedserver 'SeattleSales', 'SQL Server'
GO
-- Execute the SELECT statement.
EXECUTE ('SELECT ProductID, Name
FROM AdventureWorks.Production.Product
WHERE ProductID = ? ', 952) AT SeattleSales;
GO
참고 항목
참조
@@NESTLEVEL(Transact-SQL)
DECLARE @local\_variable(Transact-SQL)
EXECUTE AS 절(Transact-SQL)
REVERT(Transact-SQL)
sp_addlinkedserver(Transact-SQL)
SUSER_NAME(Transact-SQL)
sys.database_principals(Transact-SQL)
sys.server_principals(Transact-SQL)
USER_NAME(Transact-SQL)
OPENDATASOURCE(Transact-SQL)
관련 자료
osql 유틸리티
보안 주체
sqlcmd 유틸리티
실행 컨텍스트 이해
컨텍스트 전환 이해
도움말 및 정보
변경 내역
릴리스 | 내역 |
---|---|
2007년 9월 15일 |
|
2006년 4월 14일 |
|