1: 일반 SQL 문은 exec 명령어로 실행할 수 있습니다
tableName에서 * 선택 exec('select * from tableName') exec sp_executesql N'select * from tableName' -- 문자열 앞에 N을 반드시 추가해야 합니다
2: 필드 이름, 테이블 이름, 데이터베이스 이름 등을 변수로 사용할 때는 동적 SQL을 사용해야 합니다
@fname 바르차르(20) 선언 set @fname = 'FiledName' tableName -- Error에서 @fname을 선택하세요. 오류가 뜨지 않지만, 결과는 고정값인 FiledName이 되어 원하는 바가 아닙니다. exec('select ' + @fname + ' from tableName') -- 플러스 부호 앞뒤에 인용 부호 옆에 공백이 추가된다는 점에 유의하세요
물론, 문자열을 변수 형태로 바꿀 수도 있습니다 @fname 바르차르(20) 선언 set @fname = 'FiledName' -필드 이름을 설정하세요
@s 바르차르(1000) 선언 set @s = 'select ' + @fname + ' from tableName' exec(@s) -- 성공 exec sp_executesql @s -- 이 문장은 오류를 보고합니다
@s Nvarchar(1000)라고 선언하라 — 여기서는 nvarchar(1000)로 변경됨을 참고하세요. set @s = 'select ' + @fname + ' from tableName' exec(@s) -- 성공 임원 sp_executesql @s -- 이 문장이 맞습니다
3. 출력 매개변수 @num int, @sqls nvarchar(4000) 선언 set @sqls='table Name에서 count(*) 선택 임원(@sqls)
--실행 결과를 변수에 어떻게 넣나요?
@num int, @sqls nvarchar(4000) 선언 set @sqls='select @a=count(*) from tableName ' exec sp_executesql @sqls,N'@a int output',@num output 선택 @num
1: 일반 SQL 문은 Exec으로 실행할 수 있습니다. 예시: tableName에서 * 선택 Exec('select * from tableName') Exec sp_executesql N'select * from tableName' -- 문자열 앞에 N을 추가해야 한다는 점에 유의하세요
2: 필드 이름, 테이블 이름, 데이터베이스 이름 등을 변수로 사용할 때는 동적 SQL을 사용해야 합니다
오류: @fname varchar(20) 선언 set @fname = 'FiledName' tableName -- Error에서 @fname을 선택하세요. 오류가 뜨지 않지만, 결과는 고정값인 FiledName이 되어 원하는 바가 아닙니다. 정답: Exec('select ' + @fname + ' from tableName') -- 플러스 부호 앞뒤에 단일 따옴표 옆에 공백이 추가된 것을 주목하세요
물론, 문자열을 변수 형태로 바꿀 수도 있습니다 @fname 바르차르(20) 선언 set @fname = 'FiledName' -필드 이름을 설정하세요
@s 바르차르(1000) 선언 set @s = 'select ' + @fname + ' from tableName' 임원(@s) -- 성공 exec sp_executesql @s -- 이 문장은 오류를 보고합니다
--참고: @s 매개변수는 ntext 또는 nchar 또는 nvarchar 유형이어야 하며, varchar(1000)를 선언@s nvarchar(1000)로 변경해야 @s
다음과 같습니다: @s Nvarchar(1000)라고 선언하라 — 여기서는 nvarchar(1000)로 변경됨을 참고하세요.
set @fname = 'FiledName' -필드 이름을 설정하세요 set @s = 'select ' + @fname + ' from tableName' 임원(@s) -- 성공 임원 sp_executesql @s -- 이 문장이 맞습니다
3. 입력 또는 출력 매개변수
(1) 입력 매개변수: nvarchar(1000) @QueryString 선언 -- 동적 쿼리 진술 변수 (참고: ntext 또는 nchar nvarchar 타입이어야 하며, varchar 타입이 아님) nvarchar(200) 선언 @paramstring - 동적 문에서 매개변수 문자열을 설정하세요 (참고: ntext 또는 nchar nvarchar 타입이어야 하며, varchar 타입이 아님) @input_id int 선언 - 동적 문장에 전달할 매개변수의 값을 정의합니다
Set @QueryString='Select* from tablename, 여기서 id=@id' -id는 필드 이름, @id는 전달할 매개변수입니다 set @paramstring='@id int' -- 동적 문장에서 매개변수를 정의하는 문자열을 설정합니다 Set @input_id =1 -- 동적 문에서 전달할 매개변수의 값을 1로 설정합니다 exec sp_executesql @querystring,@paramstring,@id=@input_id 매개변수가 여러 개 있을 경우: nvarchar(1000) @QueryString 선언 -- 동적 쿼리 진술 변수 (참고: ntext 또는 nchar nvarchar 타입이어야 하며, varchar 타입이 아님) nvarchar(200) 선언 @paramstring - 동적 문에서 매개변수 문자열을 설정하세요 (참고: ntext 또는 nchar nvarchar 타입이어야 하며, varchar 타입이 아님) Declare @input_id int - 동적 문장에 전달할 매개변수 값을 정의하며, 매개변수 1 Declare @input_name varchar(20) - 동적 문장에 전달할 인수의 값을 정의하며, 매개변수 2
set @QueryString='select * from tablename (id=@id 및 name=@name' -id와 name은 필드 이름이며, @id와 @name는 전달할 매개변수입니다 Set @paramstring='@id int,@name varchar(20)' -- 동적 문장에서 매개변수 정의 문자열을 ","로 구분하여 설정합니다 Set @input_id =1 -- 동적 문에서 전달할 매개변수의 값을 1로 설정합니다 set @input_name='Zhang San' -동적 문에서 전달할 매개변수의 값을 'Zhang San'으로 설정합니다. exec sp_executesql @querystring,@paramstring,@id=@input_id,@name=@input_name -- 인수 순서를 주목하세요 (2) 출력 매개변수 @num int, @sqls nvarchar(4000) 선언 set @sqls='table Name에서 count(*) 선택 임원(@sqls) --실행 결과를 변수에 어떻게 넣나요? nvarchar(1000) 선언 @QueryString -- 동적 쿼리 이름 변수 (참고: ntext 또는 nchar nvarchar 타입이어야 하며, varchar 타입이 아님) nvarchar(200) 선언 @paramstring - 동적 문에서 매개변수 문자열을 설정하세요 (참고: ntext 또는 nchar nvarchar 타입이어야 하며, varchar 타입이 아님) @output_result int를 선언하면 쿼리 결과가 @output_result에 할당됩니다
Set @QueryString='select @totalcount=count(*) from tablename' --@totalcount 는 출력 매개변수입니다 Set @paramstring='@totalcount int output' -동적 명단의 매개변수에 의해 정의된 문자열을 ","로 구분하여 설정합니다 exec sp_executesql @querystring,@paramstring,@totalcount=@output_result 출력 선택 @output_result 물론 입력과 출력 파라미터를 함께 사용할 수 있으니 직접 시도해볼 수 있습니다. 또한, 동적 문 쿼리의 결과 집합을 출력하고 싶다면, 임시 테이블을 사용하는 다음 방법만 생각해요. 더 나은 방법이 있는지는 모르겠네요. IF object_id('[tempdb].[ dbo].#tmp')가 null이 아니라는 점 -- 임시 테이블이 존재하는지 확인하고, 존재한다면 삭제하세요 #tmp 드롭 테이블 #tmp tablename에서 *를 #tmp로 선택하고, 여기서 1=2 -- tablename과 동일한 구조로 임시 테이블 #tmp을 생성합니다
nvarchar(1000) 선언 @QueryString -- 동적 쿼리 이름 변수 (참고: ntext 또는 nchar nvarchar 타입이어야 하며, varchar 타입이 아님) Set @QueryString='테이블 이름에서 * 선택 ' #tmp(field1, field2,...) exec(@querystirng) 삽입 |