728x90
동적 SQL 은
한 예로 asp, php 등과 같은 서버 스크립트에서 SQL문을 만들 때, 테이블 명이나 필드명을 변수 처리 해서 SQL 문을 유연하게 만든 것과 같습니다.

여러 번 사용할 수 있거나, 동적으로 만들어진 Transact-SQL문 또는 일괄 처리를 실행합니다. Transact-SQL문 또는 일괄 처리는 포함 매개 변수를 포함할 수 있습니다.


구문

sp_executesql [@stmt =] stmt[
   
{, [@params =] N'@parameter_name  data_type [,...n]' }
     {, [@param1 =] 'value1' [,...n] }
]


@stmt 인수에 대하여
Transact-SQL문 또는 일괄 처리를 포함한 유니코드 문자열입니다. stmt는 암시적으로 ntext로 변환될 수 있는 변수 또는 유니코드 상수여야 합니다. + 연산자로 두 개의 문자열을 연결한 식 등과 같은 보다 복잡한 유니코드식은 사용할 수 없습니다. 문자 상수도 사용할 수 없습니다. 상수가 지정된 경우에는 N이라는 접두사가 있어야 합니다.


실제로 테스트를 해 보겠습니다.



pubs DB를 이용한 테스트 : 변수가 하나일 때
 
execute sp_executesql
    N'select * from pubs.dbo.employee where job_lvl = @level',
    N'@level tinyint',
    @level = 35


pubs DB를 이용한 테스트 : 변수가 두개일 때
 
DECLARE @IntVariable INT, @IntVariable2 INT
DECLARE @SQLString NVARCHAR(500)
DECLARE @ParmDefinition NVARCHAR(500)

SET @SQLString = N'SELECT * FROM pubs.dbo.employee WHERE job_lvl = @level and job_id = @job_id'

SET @ParmDefinition = N'@level tinyint, @job_id smallint'

SET @IntVariable = 35
SET @IntVariable2 = 14

EXECUTE sp_executesql @SQLString,
                    @ParmDefinition,
                    @level = @IntVariable,
                    @job_id = @IntVariable2
728x90

--이문장을 실행하시면 모든테이블을 대상으로 해당 command가 실행됩니다.
exec sp_MSforeachtable "exec sp_spaceused '?'"


아래 내용은 http://www.bstsoftware.com/tsug/Nov99/sp_MSforeachtable.html 에서 발췌

sp_MSforeachtable (T-SQL)

--------------------------------------------------------------------------------

Syntax

sp_MSforeachtable [@command1 =] 'sql_command'
   [, [@replacechar =] 'replacement_character']
   [, [@command2 =] 'sql_command']
   [, [@command3 =] 'sql_command']
   [, [@whereand =] 'sql_command']
   [, [@precommand =] 'sql_command']
   [, [@postcommand =] 'sql_command']

Arguments

[@command1 =] 'sql_command'     Is the sql command to apply to each user table with the
replacement_character where the table name would normally be placed. 'sql_command' is nvarchar(2000)*,
varchar(255)+ with no default. 


[, [@replacechar =] 'replacement_character']     Is the wild card character that will be replaced with each
user table name. replacement_character is char(1) with a default of '?' 


[, [@command2 =] 'sql_command']     Is the continuation of the sql command entered in @command1 to apply
to each user table with the replacement_character where the table name would normally be placed.
sql_command is nvarchar(2000)*, varchar(255)+ with a default of NULL. (Note: This parameter is not as useful
on 7.0 since there are 4000 characters available in @command1) 


[, [@command3 =] 'sql_command']     Is the continuation of the sql command entered in @command2 to apply
to each user table with the replacement_character where the table name would normally be
placed. 'sql_command' is nvarchar(2000)*, varchar(255)+ with a default of NULL. (Note: This parameter is not
as useful on 7.0 since there are 4000 characters available in @command1) 


[, [@whereand =] 'sql_command']     Is an additional where clause to limit the result set of the user table
select. sql_command is nvarchar(2000)*, varchar(255)+ with a default of NULL. No wild card replacement
occurs. It is added to the select that retrieves the user tables as passed to the procedure. It MUST be a valid
where clause for a select against sysobjects. 


[, [@precommand =] 'sql_command']     Is the sql command to be executed once before @command1 is
processed. sql_command is nvarchar(2000)*, varchar(255)+ with a default of NULL. No wild card replacement
occurs. It is executed as passed to the procedure. 


[, [@postcommand =] 'sql_command']     Is the sql command to be executed once after @command1 is
processed. sql_command is nvarchar(2000)*, varchar(255)+ with a default of NULL. No wild card replacement
occurs. It is executed as passed to the procedure. 


Return Code Values

0 (success) or @@ERROR (failure)

Result Sets

sp_MSforeachtable returns this message if no parameters are specified:

Procedure 'sp_MSforeachtable' expects parameter '@command1', which was not supplied.

Remarks

The procedure sp_MSforeachtable executes a set of commands against all the user tables in the current
database. The sp_MSforeachtable procedure executes the precommand if entered. It then declares a cursor
called hCForEach against sysobjects in the current database and passes the actual commands to be executed
to sp_MSforeach_worker. The post command is then executed if entered.

Examples

Get the number of rows in each user table

sp_MSforeachtable 'print ''?'' select count(*) from ?'

sp_MSforeachtable 'select count(*) "?" from ?'

Grant SELECT permission to the developers on every user table

EXECUTE sp_MSforeachtable 'GRANT SELECT ON ? TO Developers'

Grant all permissions to the database maintenance role on every user meta data table

EXECUTE sp_MSforeachtable @command1    = 'PRINT ''?'' GRANT SELECT , INSERT , UPDATE , DELETE
ON ? TO dbMaintenace'
                        , @whereand    = 'AND name LIKE ''tbl%REF'' ORDER BY uid , name'
                        , @precommand  = 'PRINT ''Granting permission on...'''
                        , @postcommand = 'PRINT ''Complete!'''


728x90
쿼리분석기를 사용하다가 내용이 긴 열의 텍스트(내용)을 보는데, 잘려서 텍스트를 보지 못하는 일이 있습니다.
이럴 때는 옵션을 변경해서 좀더 긴 내용을 볼 수가 있습니다.



변경 방법
 
1. 쿼리분석기를 실행시킵니다.

2. 도구 -> 옵션 을 실행합니다.

3. 옵션에서 결과 탭을 클릭하고 아래 그림처럼 "열 당 최대 문자 수(M)"의 값을 8000 정도로 늘려 줍니다.



사용자 삽입 이미지






















4. SQL을 실행시켜서 긴 텍스트를 테스트 해 보시기 바랍니다.

+ Recent posts