drop table #aaa
drop table #bbb

CREATE Table #aaa
 KeyCol varchar(10),
 Section varchar(10)

CREATE Table #bbb
 KeyCol varchar(10),
 Name varchar(10),
 Score bigint

Insert Into #aaa SELECT 'A1001', 'Eng'
Insert Into #aaa SELECT 'A1002', 'Kor'
Insert Into #aaa SELECT 'A1003', 'Cha'

Insert Into #bbb SELECT 'A1001', '신근태', 90
Insert Into #bbb SELECT 'A1001', '우장일', 85
Insert Into #bbb SELECT 'A1001', '정종태', 80

Insert Into #bbb SELECT 'A1002', '신근태', 78
Insert Into #bbb SELECT 'A1002', '우장일', 88
Insert Into #bbb SELECT 'A1002', '정종태', 98

Insert Into #bbb SELECT 'A1003', '신근태', 85

--기본 Left Join
 A.KeyCol, a.Section, b.Name, b.Score
 #aaa a
 LEFT JOIN #bbb b ON a.KeyCol = b.KeyCol

 A.KeyCol, a.Section, b.*
 #aaa a
   Cast([신근태] As varchar(10)) As [신근태],
   Cast([우장일] As varchar(10)) As [우장일],
   Cast([정종태] As varchar(10)) As [정종태]
   FOR Name in ([신근태], [우장일], [정종태]) 
  ) as PivotTable 
 ) b ON a.KeyCol = b.KeyCol
 A.KeyCol, a.Section, c.*
 #aaa a
   Distinct KeyCol,
   select ';' + cast(isnull(A.Name, '') as nvarchar(200))
    Select Distinct Name
    From #bbb
    Where KeyCol = B.KeyCol 
   ) A
   ),1,1,'') As Contents
   #bbb B
 ) C ON a.KeyCol = c.KeyCol




->  해당 Value 다음 (2, 1) 번빼 값이 AA 에 맵핑되어 들어갑니다.



-> 해당 Value의 마지막 값이 맵핑되어 들어갑니다.


-> 해당 Value의 처음 값이 맵핑되어 들어갑니다.



-> 해당 row 번호를 보여줍니다.이를 이용해 처음과 끝데이터를 추출할수 있습니다.

Select  A.[object_id]
   , OBJECT_NAME(A.[object_id]) AS Table_Name
   , A.Index_ID
   , A.[Name] As Index_Name
   , CAST(
     Case When A.type = 1 AND is_unique = 1 Then 'Create Unique Clustered Index '
       When A.type = 1 AND is_unique = 0 Then 'Create Clustered Index '
       When A.type = 2 AND is_unique = 1 Then 'Create Unique NonClustered Index '
       When A.type = 2 AND is_unique = 0 Then 'Create NonClustered Index '
     + quotename(A.[Name]) + ' On ' + quotename(S.name) + '.' + quotename(OBJECT_NAME(A.[object_id])) + ' ('
     + Stuff(
          ',[' + COL_NAME(A.[object_id],C.column_id)
          + Case When C.is_descending_key = 1 Then '] Desc' Else '] Asc' End
        From sys.index_columns C WITH (NOLOCK)
        Where A.[Object_ID] = C.object_id
          And A.Index_ID = C.Index_ID
          And C.is_included_column = 0
        Order by C.key_Ordinal Asc
        For XML Path('')
       ,1,1,'') + ') '

     + CASE WHEN A.type = 1 THEN ''
       ELSE Coalesce('Include ('
         + Stuff(
              ',' + QuoteName(COL_NAME(A.[object_id],C.column_id))
            From sys.index_columns C WITH (NOLOCK)
            Where A.[Object_ID] = C.object_id
              And A.Index_ID = C.Index_ID
              And C.is_included_column = 1
            Order by C.index_column_id Asc
            For XML Path('')
           ,1,1,'') + ') '
      ,'') End
     + Case When A.has_filter = 1 Then 'Where ' + A.filter_definition Else '' End
     + ' With (Drop_Existing = OFF, SORT_IN_TEMPDB = ON'
     --when the same index exists you'd better to set the Drop_Existing = ON
     --SORT_IN_TEMPDB = ON is recommended but based on your own environment.
     + ', Fillfactor = ' + Cast(Case When fill_factor = 0 Then 100 Else fill_factor End As varchar(3))
     + Case When A.[is_padded] = 1 Then ', PAD_INDEX = ON' Else ', PAD_INDEX = OFF' END
     + Case When D.[no_recompute] = 1 Then ', STATISTICS_NORECOMPUTE  = ON' Else ', STATISTICS_NORECOMPUTE  = OFF' End                 
     + Case When A.[ignore_dup_key] = 1 Then ', IGNORE_DUP_KEY = ON' Else ', IGNORE_DUP_KEY = OFF' End
     + Case When A.[ALLOW_ROW_LOCKS] = 1 Then ', ALLOW_ROW_LOCKS = ON' Else ', ALLOW_ROW_LOCKS = OFF' END
     + Case When A.[ALLOW_PAGE_LOCKS] = 1 Then ', ALLOW_PAGE_LOCKS = ON' Else ', ALLOW_PAGE_LOCKS = OFF' End 
     + Case When P.[data_compression] = 0 Then ', DATA_COMPRESSION = NONE'
       When P.[data_compression] = 1 Then ', DATA_COMPRESSION = ROW'
       Else ', DATA_COMPRESSION = PAGE' End                
     + ') On '
     + Case when C.type = 'FG' THEN quotename(C.name)
       ELSE quotename(C.name) + '(' + F.Partition_Column + ')' END + ';' --if it uses partition scheme then need partition column
   As nvarchar(Max)) As Index_Create_Statement
   , C.name AS FileGroupName
   , 'DROP INDEX ' + quotename(A.[Name]) + ' On ' + quotename(S.name) + '.' + quotename(OBJECT_NAME(A.[object_id])) + ';' AS Index_Drop_Statement
From  SYS.Indexes A WITH (NOLOCK)
   sys.objects B WITH (NOLOCK)
    ON A.object_id = B.object_id
   SYS.schemas S
    ON B.schema_id = S.schema_id           
   SYS.data_spaces C WITH (NOLOCK)
    ON A.data_space_id =   C.data_space_id  
   SYS.stats D WITH (NOLOCK)
    ON A.object_id = D.object_id
     AND A.index_id = D.stats_id 
    Inner Join
   --The below code is to find out what data compression type was used by the index. If an index is not partitioned, it is easy as only one data compression
   --type can be used. If the index is partitioned, then each partition can be configued to use the different data compression. This is hard to generalize,
   --for simplicity, I just use the data compression type used most for the index partitions for all partitions. You can later rebuild the index partition to
   --the appropriate data compression type you want to use
    select object_id, index_id, Data_Compression, ROW_NUMBER() Over(Partition By object_id, index_id Order by COUNT(*) Desc) As Main_Compression
    From sys.partitions WITH (NOLOCK)
    Group BY object_id, index_id, Data_Compression
   ) P
    ON A.object_id = P.object_id
     AND A.index_id = P.index_id
     AND P.Main_Compression = 1
    Outer APPLY
    SELECT COL_NAME(A.object_id, E.column_id) AS Partition_Column
    From sys.index_columns E WITH (NOLOCK)
    WHERE E.object_id = A.object_id
      AND E.index_id = A.index_id
      AND E.partition_ordinal = 1
   ) F    
Where  A.type IN (1,2) --clustered and nonclustered
   AND B.Type != 'S'
   AND is_primary_key = 0 --this is not for primary key constraint
   AND OBJECT_NAME(A.[object_id]) not like 'queue_messages_%'
   AND OBJECT_NAME(A.[object_id]) not like 'filestream_tombstone_%'
   AND OBJECT_NAME(A.[object_id]) not like 'sys%' --if you have index start with sys then remove it
OPTION (Recompile);




sp_helptable 테이블명 : 테이블에 대한 전반적이 정보를 모두 확인가능.


sp_activeroles :

사용자의 로그인에 부여된 현재 롤(role)을 모두 표시합니다.


Adaptive Server 사용자가 데이터베이스에서 다른 사용자 이름으로 인식되는 것을 허용합니다.

sp_addauditrecord :

사용자가 사용자 정의 감사 레코드(주석)를 감사 기록에 입력하는 것을 허용합니다.


감사 기능을 설치한 후 다른 시스템 감사 테이블을 추가합니다.

sp_addengine :

엔진을 기존 엔진 그룹에 추가하거나, 엔진 그룹이 없으면 엔진 그룹을 만들어 엔진을 추가합니다.

sp_addexeclass :

클라이언트 응용 프로그램, 로그인, 내장 프로시저에 바인드할 수 있는 사용자 정의 실행 클래스를 만들거나 업데이트합니다.

sp_addextendedproc :

확장 내장 프로시저(ESP)를 master 데이터베이스에 만듭니다.

sp_addexternlogin :

CIS(Component Integration Services)를 통해 원격 서버와 통신할 때 사용할 대체 로그인 계정과 암호를 만듭니다.

sp_addgroup :

그룹을 데이터베이스에 추가합니다. 그룹은 권한을 부여하거나 취소할 때 집합적 이름으로 사용됩니다.

sp_addlanguage :

대체 언어의 월과 요일의 이름과 날짜 형식을 정의합니다.

sp_addlogin :

새 사용자 계정을 Adaptive Server에 추가합니다.

sp_addmessage :

내장 프로시저 print와 raiserror 호출과 sp_bindmsg에서 사용할 수 있도록 사용자 정의 메시지를 sysusermessages에 추가합니다.

sp_addobjectdef :

로컬 테이블과 외부 저장 위치 사이의 매핑을 지정합니다.

sp_add_qpgroup :

Abstract Plan(AP) 그룹을 추가합니다.

sp_addremotelogin : master.dbo.sysremotelogins에 엔트리를 추가하여 원격 서버 사용자에게 권한을 부여합니다.

sp_add_resource_limit :

질의나 질의 배치, 트랜잭션을 실행할 때 로그인이나 응용 프로그램에서 사용할 수 있는 서버 자원의 양에 대한 제한을 만듭니다.

sp_addsegment :

현재 데이터베이스의 데이터베이스 디바이스에 세그먼트를 정의합니다.

sp_addserver :

원격 서버를 정의하거나 로컬 서버의 이름을 정의합니다.

sp_addthreshold :

데이터베이스 세그먼트에 있는 공간을 모니터하기 위한 임계값을 만듭니다. 세그먼트의 여유 공간이 지정한 수준 아래로 내려가면, Adaptive Server는 연관된 내장 프로시저를 실행합니다.

sp_add_time_range :

이름이 지정된 시간 범위를 Adaptive Server에 추가합니다.

sp_addtype :

사용자 정의한 데이터 유형을 만듭니다.

sp_addumpdevice  :

덤프 디바이스를  Adaptive Server에 추가합니다.

sp_adduser :

새 사용자를 현재 데이터베이스에 추가합니다.

sp_altermessage :

특정 시스템 정의 메시지나 사용자 정의 메시지를 Adaptive Server 에러 로그에 기록할 수 있게 하거나 기록할 수 없게 합니다.

sp_audit :

시스템 보안 담당자가 감사 선택 항목을 구성할 수 있게 해줍니다.

sp_autoconnect :

이름이 지정된 사용자가 로그인할 때 자동으로 passthrough 모드로 들어갈 수 있도록, 특정 사용자에게 원격 서버에 대한  passthrough 연결을 정의해 줍니다.

sp_bindcache :

데이터베이스나 테이블, 인덱스, text 객체, image 객체를 데이터 캐시에 바인드합니다.

sp_bindefault :

사용자 정의 디폴트를 열이나 사용자 정의 데이터 유형에 바인드 합니다.

sp_bindexeclass  :

실행 클래스를 클라이언트 응용 프로그램이나 로그인,, 내장 프로시저와 연관시킵니다.

sp_bindmsg :

사용자 메시지를 참조 무결성 제약 조건이나 검사 제약 조건에 바인드합니다.

sp_bindrule :

규칙을 열이나 사용자 정의 데이터 유형에 바인드 합니다.

locksp_cacheconfig :

데이터 캐시에 대한 정보를 만들거나 구성, 다시 구성, 삭제, 제공을 합니다.

sp_cachestrategy :

테이블이나 인덱스 text 객체, image 객체에 대한 MRU 캐시 대체 전략과 프리페치(대량 입/출력)를 가능하게 하거나 가능하지 않게 합니다.

sp_changedbowner :

데이터베이스의 소유자를 변경합니다.

sp_changegroup :

사용자 그룹을 변경합니다.

sp_checknames :

7-비트 ASCII 집합에 없는 문자가 이름에 들어 있는지 현재 데이터베이스를 검사합니다.

sp_checkreswords :

Transact-SQL 예약어인 식별자를 검색하여 표시합니다. 서버 이름과 디바이스 이름, 데이터베이스 이름, 세그먼트 이름, 사용자 정의 데이터 유형, 객체 이름, 열 이름, 사용자 이름, 로그인 이름, 원격 로그인 이름을 검사합니다.

sp_checksource :

컴파일된 객체에 소스 텍스트가 있는지 검사합니다.

sp_chgattribute :

테이블이나 인덱스의 추후 공간 할당을 위해 max_rows_per_page 값을 변경합니다.

sp_clearpsexe :

sp_setpsexe에서 설정한 클라이언트 응용 프로그램, 로그인, 내장 프로시저의 실행 속성을 지웁니다.

sp_clearstats :

모든 서버 사용자나 지정한 사용자에 대한 새 계정 기간을 시장합니다. sp_reportstats를 실행하여 이전 기간 동안의 통계를 인쇄합니다.

sp_cmp_all_qplans :

모든 Abstract Plan(AP)을 두 개의 Abstract Plan(AP) 그룹에서 비교합니다.

sp_cmp_qplans : 두 개의 Abstract Plan(AP)을 비교합니다.

sp_commonkey :

두 개의 테이블이나 뷰 사이의 자주 조인되는 common 키 열을 정의합니다.

sp_companion :

Adaptive Server를 고가용성(HA) 시스템의 보조 companion으로 구성하고 companion 서버를 한 failover 모드에서 다른 모드로 이동하는 등의 클러스터 작업을 수행합니다.

sp_configure : 구성 매개변수를 표시하거나 변경합니다.

sp_copy_all_qplans :

한 Abstract Plan(AP) 그룹의 모든 계획을 다른 그룹으로 복사합니다.

sp_copy_qplan :

한 Abstract Plan(AP) Abstract Plan(AP) 그룹으로 복사합니다.

sp_countmetadata :

Adaptive Server의 인덱스, 객체, 데이터베이스 개수를 표시합니다.

sp_cursorinfo :

사용자 세션에서 활성 중인 특정 커서나 모든 커서에 대한 정보를 보고합니다.

locksp_dboption : 데이터베이스 옵션을 표시하거나 변경합니다.

sp_dbremap :

alter database에서 만든 변경 내용을 Adaptive Server에서 인식하게 만듭니다. Adaptive Server 메시지에서 지시한 경우에만 이 프로시저를 실행합니다.

sp_depends :

특정 테이블이나 뷰에 종속된 뷰, 트리거, 프로시저와 특정 뷰, 트리거, 프로시저가 종속되어 있는 테이블이나 뷰와 가타은 데이터베이스 객체 종속 관계에 대한 정보를 표시합니다.

sp_deviceattr :

기존 데이터베이스 디바이스 파일의 dsync 설정을 변경합니다.

sp_diskdefault :

사용자가 데이터베이스 디바이스를 지정하지 않은 경우 데이터베이스 디바이스를 데이터베이스 저장소로 사용할 수 있는지 여부를 지정하거나, create database나 alter database 명령의 default를 지정합니다.

sp_displayaudit : 감사 선택 항목의 상태를 표시합니다.

sp_displaylevel :

sp_configure 출력에 나타나야 할 Adaptive Server 구성 매개변수를 설정하거나 표시합니다.

sp_displaylogin : 로그인 계정에 대한 정보를 표시합니다.

sp_displayroles :

다른 롤(role)에 부여된 모든 롤(role)을 표시하거나 롤(role)의 전체 계층 트리를 표 형식으로 표시합니다.

sp_dropalias :

sp_addalias를 사용하여 설정했던 가명(alias) 사용자 이름을 삭제 합니다.

sp_drop_all_qplans :

모든 Abstract Plan(AP)을 Abstract Plan(AP) 그룹에서 삭제합니다.

sp_dropdevice :

Adaptive Server 데이터베이스 디바이스나 덤프 디바이스를 삭제 합니다.

sp_dropengine :

지정한 엔진 그룹에서 엔진을 삭제하거나 해당 엔진이 그룹의 마지막 엔진인 경우 엔진 그룹을 삭제합니다.

sp_dropexeclass : 사용자 정의 실행 클래스를 삭제합니다.

sp_dropextendedproc : Master database에서 ESP를 삭제합니다.

sp_dropglockpromote :

데이터베이스나 테이블에서 lock 실행 값을 삭제합니다.

sp_dropgroup : 데이터베이스에서 그룹을 삭제합니다.

sp_dropkey :

syskeys 테이블에서 sp_primarykey나 sp_foreignkey, sp_commonkey로 정의한 키를 삭제합니다.

sp_droplanguage :

서버에서 대체 언어를 삭제하고 해당 행을 master.dbo.syslanguages에서 삭제합니다.

sp_droplogin :

사용자 엔트리를 master.dbo.syslogins에서 삭제하여 Adaptive Server 사용자 로그인을 삭제합니다.

sp_dropmessage : 사용자 정의 메시지를 sysusermessages에서 삭제합니다.

sp_drop_qpgroup : Abstract Plan(AP) 그룹을 삭제합니다.

sp_drop_qplan : Abstract Plan(AP)을 삭제합니다.

sp_dropremotelogin : 원격 사용자 로그인을 삭제합니다.

sp_drop_resource_limit :

하나 이상의 자원 제한값을 Adaptive Server에서 삭제합니다.

sp_dropsegment :

데이터베이스에서 세그먼트를 삭제하거나 세그먼트를 특정 데이터베이스 디바이스에서 매핑 해제합니다.

sp_dropserver : 알려진 서버 목록에서 서버를 삭제합니다.

sp_dropthreshold : 세그먼트에서 여유 공간 임계값을 삭제합니다.

sp_drop_time_range :

Adaptive Server에서 사용자 정의 시간 범위를 삭제합니다.

sp_droptype : 사용자 정의 테이터 유형을 삭제합니다.

sp_dropuser : 현재 데이터베이스에서 사용자를 삭제합니다.

sp_dumpoptimize :

데이터베이스 덤프 작업 중에 Backup Server에서 덤프하는 데이터 크기를 지정합니다.

sp_estspace :

테이블과 테이블 인덱스에 필요한 공간의 크기와 인덱스를 만드는데 필요한 시간을 추정합니다.

sp_export_qpgroup :

지정한 사용자와 Abstract Plan(AP) 그룹에 대한 모든 계획을 사용자 테이블로 내보냅니다.

sp_extendsegment :

세그먼트의 범위를 다른 데이터베이스 디바이스로 확장합니다.

sp_familylock :

구문을 병렬로 실행하는 패밀리(조정 프로세스와 작업자 프로세스)에서 보유하는 모든 lock에 대한 정보를 보고합니다.

sp_find_qplan :

질의 텍스트나 계획 텍스트에서 파생된 패턴인, Abstract Plan(AP)을 찾습니다.

sp_flushstats :

메모리내에서 systabstats 시스템 테이블로 통계를 전달합니다.

sp_forceonline_db :

복구로 인해 오프라인으로 전환되었던 데이터베이스의 모든 페이지에 대한 액세스를 제공합니다.

sp_forceonline_page :

복구로 인해 오프라인으로 전환되었던 페이지에 대한 액세스를 제공합니다.

sp_foreignkey : 현재 데이터베이스의 테이블이나 뷰에 외부키를 정의합니다.

sp_freedll :

ESP 실행을 지원하기 위해 XP Server 메모리에 로드되었던 동적 연결 라이브러리(DLL)를 언로드합니다.

sp_getmessage :

print와 raiserror 문의 sysmessages와 sysusermessages에서 저장 메시지 문자열을 검색합니다.

sp_grantlogin :

Windows NT 전용으로 통합 보안 모드나 혼합 모드(Named

Pipes를 사용하여)가 활성화되어 있으면 Adaptive Server 롤(role)이나 default 권한을 Windows NT 사용자 및 그룹에 할당합니다.

sp_ha_admin :

고가용성(HA) 시스템에서 Sybase failover로 구성되어 있는 Adaptive Server에 관리 작업을 수행합니다. sp_ha_admin은 installhavss 스크립트(Windows NT에서는 insthasv)와 함께 설치됩니다.

sp_help :

데이터베이스 객체(sysobjects에 나열되어 있는 모든 객체)에 대한 정보와 Adaptive Server 제공 데이터 유형이나 사용자 정의 데이터 유형에 대한 정보를 보고합니다.

sp_helpartition :

partition 테이블의 각 partition에 대한 첫 페이지와 컨트롤 페이지를 나열합니다.

sp_helpcache :

데이터 캐시에 바운드되어 있는 객체에 대한 정보나 지정한 캐시 크기에 필요한 오버헤드 크기에 대한 정보를 표시합니다.

sp_helpdb :

특정 데이터베이스나 모든 데이터베이스에 대한 정보를 보고합니다.

sp_helpdevice :

특정 디바이스에 대한 정보나 모든 Adaptive Server 데이터베이스 디바이스와 덤프 디바이스에 대한 정보를 보고합니다.

sp_helpextendedproc :

현재 데이터베이스에 등록된 ESP를 관련 DLL 파일과 함께 표시합니다.

sp_helpexternlogin :

CIS(Component Integration Services) 전용으로 외부 로그인 이름에 대한 정보를 보고합니다.

sp_helpgroup :

현재 데이터베이스의 모든 그룹에 대한 정보나 특정 그룹에 대한 정보를 보고합니다.

sp_helpindex : 테이블에 만든 인덱스에 대한 정보를 보고합니다.

sp_helpjava :

데이터베이스에 설치되어 있는 Java 클래스와 관련 JAR에 대한 정보를 표시합니다.

sp_helpjoins :

조인 대상이 될 가능성이 있는 두 개의 테이블이나 뷰의 열을 나열 합니다.

sp_helpkey :

특정 테이블이나 뷰의 Primary 키, 외부키, common 키에 대한 정보나 현재 데이터베이스의 모든 키에 대한 정보를 보고합니다.

sp_helplanguage : 특정 대체 언어나 모든 언어에 대한 정보를 보고합니다.

sp_helplog :

트랜잭션 로그의 첫 페이지가 들어 있는 디바이스의 이름을 보고합니다.

sp_helpobjectdef :

CIS(Component Integration Services) 전용으로 원격 객체 정의에 대한 정보를 보고합니다. 소유자, 객체, 유형, 정의를 표시합니다.

sp_help_qpgroup : Abstract Plan(AP) 그룹에 대한 정보를 보고합니다.

sp_help_qplan : Abstract Plan(AP)에 대한 정보를 보고합니다.

sp_helpremotelogin :

특정 원격 서버의 로그인이나 모든 원격 서버의 로그인에 대한 정보를 보고합니다.

sp_help_resource_limit :

모든 자원 제한값이나 주어진 로그인이나 응용 프로그램에 대한 제한값, 주어진 시간이나 요일에 유효한 제한값, 주어진 범위나 작업의 제한값에 대한 정보를 보고합니다.

sp_helprotect :

데이터베이스 객체, 사용자, 그룹, 롤(role)에 대한 권한을 보고합니다.

sp_helpsegment :

현재 데이터베이스의 모든 세그먼트나 특정 세그먼트에 대한 정보를 보고합니다.

sp_helpserver : 특정 원격 서버나 모든 원격 서버에 대한 정보를 보고합니다.

sp_helpsort :

Adaptive Server의 기본 정렬 순서와 문자 집합을 표시합니다.

sp_helptext :

시스템 프로시저나 트리거, 뷰, 디폴트, 규칙 무결성 검사 제약 조건의 텍스트를 인쇄합니다.

sp_helpthreshold :

현재 데이터베이스의 모든 임계값이나 특정 세그먼트의 모든 임계값과 관련된 세그먼트, 여유 공간 값, 상태, 내장 프로시저를 보고합니다.

sp_helpuser :

현재 데이터베이스의 모든 사용자나 특정 사용자에 대한 정보를 보고합니다.

sp_import_qpgroup :

Abstract Plan(AP)을 사용자 테이블에서 Abstract Plan(AP) 그룹으로 가져옵니다.

sp_indsuspect :

정렬 순서 변경을 한 후 복구 중에 추정으로 표시된 인덱스가 있는지 사용자 테이블에서 검사합니다.

sp_listsuspect_db :

복구 시 손상으로 인해 오프라인 페이지가 들어 있는 데이터베이스를 모두 나열합니다.

sp_listsuspect_page :

복구 시 손상으로 인해 현재 오프라인 페이자가 들어 있는 페이지를 모두 나열합니다.

sp_lock : 현재 lock을 보유하고 있는 프로세스에 대한 정보를 보고합니다.

sp_locklogin :

사용자가 로그인할 수 없게 Adaptive Server 계정을 잠그거나 모든 잠궈진 계정의 목록을 표시합니다.

sp_logdevice :

로그 및 데이터를 같은 디바이스에 가지고 있는 데이터베이스의 트랜잭션 로그를 별개의 데이터베이스 디바이스로 이동합니다.

sp_loginconfig :

Windows NT 전용으로 하나 또는 모든 통합 보안 매개변수의 값을 표시합니다.

sp_logininfo :

Windows NT 전용으로 sp_grantlogin을 사용하여 Windows NT 사용자와 그룹에 부여된 모든 롤(role)을 표시합니다.

sp_logiosize :

Adaptive Server에서 현재 데이터베이스의 트랜잭션 로그에 대한 입/출력을 할 때 사용하는 로그 입/출력 크기를 다른 메모리 풀로 변경합니다.

sp_modifylogin :

Adaptive Server 로그인 계정의 Primary database나 기본 언어, 기본 롤 (role) 사용이나 전체 이름을 수정합니다.

sp_modify_resource_limit :

새 제한값을 지정하거나 제한값이 초과했을 때 취할 조치 또는 둘을 모두 지정하여 자원 제한값을 변경합니다.

sp_modifythreshold :

임계값을 다른 임계값 프로시저와 여유 공간 수준, 세그먼트 이름과 연결하여 수정합니다. sp_modifythreshold를 사용하여 마지막 임계값의 세그먼트 이름이나 여유 공간 크기를 변경 할 수 없습니다.

sp_modify_time_range :

이름이 지정된 시간 범위와 관련된 시작일, 시작 시간, 종료일, 종료 시간 등을 변경합니다.

sp_monitor : Adaptive Server에 대한 통계를 표시합니다.

sp_password :

Adaptive Server 로그인 계정의 암호를 추가하거나 변경합니다.

sp_placeobject :

테이블이나 인덱스의 추후 공간 할당을 특정 세그먼트에 둡니다.

sp_plan_dbccdb :

새 dbccdb와 dbccalt 데이터베이스의 적합한 크기를 권장하고 dbccdb와 dbccalt의 적절한 디바이스를 나열하며 캐시 크기와 대상 데이터베이스의 작업자 프로세스의 적당한 개수를 제안합니다.

sp_poolconfig :

데이터 캐시 내에서 메모리 풀에 대한 정보를 제공하고, 크기를 다시 조정하고, 삭제하며 만듭니다.

sp_primarykey : 테이블이나 뷰에 Primary 키를 정의합니다.

sp_processmail :

Windows NT 전용으로 Adaptive Server 받은 편지함의 메시지를 읽고 처리하고 전송하며 삭제합니다.

sp_procqmode : 내장 프로시저, 뷰, 트리거의 질의 처리 모드를 표시합니다.

sp_procxmode :

내장 프로시저와 관련된 트랜잭션 모드를 표시하거나 변경합니다.

sp_recompile :

이름이 지정된 테이블을 사용하는 각 내장 프로시저와 트리거가 다음에 실행될 때 다시 컴파일되게 합니다.

sp_remap :

4.8 이상과 10.0 이전의 내장 프로시저나 트리거, 규칙, 디폴트, 뷰가 10.0 이상 릴리스와 호환될 수 있도록 다시 매핑합니다. 릴리스 11.0의 업그레이드 절차에서 다시 매핑하는 데 실패한 11.0 이전 릴리스 객체에 대해서는 sp_remap를 사용하십시오.

sp_remoteoption : 원격 로그인 옵션을 표시하거나 변경합니다.

sp_rename :

현재 데이터베이스에 있는 사용자의 구성 객체나 사용자 정의 데이터 유형의 이름을 변경합니다.

sp_renamedb :

데이터베이스 이름을 변경합니다. 시스템 테이터베이스 이름이나 외부 참조 무결성 제약 조건이 있는 테이터베이스의 이름은 변경 할 수 없습니다.

sp_rename_qpgroup : Abstract Plan(AP) 그룹의 이름을 바꿉니다.

sp_reportstats : 시스템 사용량에 대한 통계를 보고합니다.

sp_revokelogin :

Windows NT 전용으로 통합 보안 모드나 혼합모드(Named Pipes를 사용하여)가 활성화되어 있으면 Windows NT 사용자와 그룹에서 Adaptive Server 롤(role)과 기본 권한을 취소합니다.

sp_role :

Adaptive Server 로그인 계정에 시스템 롤(role)을 부여하거나 취소합니다.

sp_serveroption : 원격 서버 옵션을 표시가거나 변경합니다.

sp_setlangalias : 대체 언어의 가명(alias)을 지정하거나 변경합니다.

sp_setpglockpromote :

데이터베이스나 테이블, Adaptive Server의 lock 실행 임계값을 설정하거나 변경합니다.

sp_setpsexe :

활성 클라이언트 응용 프로그램과 로그인, 내장 프로시저의 사용자 정의 실행 속성을 “바로” 설정합니다.

sp_set_qplan :

연관된 질의를 변경하지 않고 기존 계획의 Abstract Plan(AP) 텍스트를 변경합니다.

sp_setsuspect_granularity : 복구 장애 결리 모드를 표시하고 설정합니다.

sp_setsuspect_threshold :

복수 시, 전체 데이터베이스를 오프라인으로 전환하기 전에 Adaptive Server가 지정한 데이터베이스에서 허용할 최대 추정 페이지 개수를 설정합니다.

sp_showcontrolinfo :

엔진 그룹 할당, 바운드 클라이언트 응용 프로그램, 로그인, 내장 프로시저에 대한 정보를 표시합니다.

sp_showexeclass :

지정한 실행 클래스와 연관된 엔진 그룹의 엔진과 실행 크래스 속성을 표시합니다.

sp_showplan :

현재 SQL 문(또는 같은 배치의 이전 구문)의 사용자 연결에 대한 질의 계획을 표시합니다. 질의 계획은 showplan 형식으로 표시됩니다.

sp_showpsexe :

Adaptive Server에서 실행되는 모든 프로세스에 대한 실행 클래스, 현재 우선 순위, 연결을 표시합니다.

sp_spaceused :

현재 데이터베이스의 한 테이블이나 모든 테이블에서 사용하는 예상 행 수, 예상 데이터 페이지 수 및 예상 공간 값을 표시합니다.

sp_syntax :

Transact-SQL 문의 구문, 시스템 프로시저, 유틸리티, 기타 루틴을 Adaptive Server에 있는 제품과 해당 sp_syntax 스크립트에 따라 표시합니다.

sp_sysmon : 성능 정보를 표시합니다.

sp_thresholdaction :

임계값이 다른 프로시저와 연관되어 있지 않은 경우, 로그 세그먼트의 사용 가능한 페이지 개수가 마지막 임계값 아래로 떨어지면 자동으로ㅗ 실행합니다. Sybase에서는 이 프로시저를 제공하지 않습니다.

sp_transactions :

활성 트랜잭션에 대한 정보를 보고합니다.

sp_unbindcache :

데이터베이스나 테이블, 인덱스, text 객체, image 객체를 데이터 캐시에서 바인드 해제합니다.

sp_unbindcache_all :

캐시에 바운드되어 있는 모든 객체를 바인드 해제합니다.

sp_unbindefault :

생성된 디폴트를 열이나 사용자 정의 데이터 유형에서 바인드 해제합니다.

sp_unbindexeclass :

데이터베이스나 테이블, 인덱스, text 객체나 image 객체를 데이터 캐시에서 바인드 해제합니다.

sp_unbindmsg :

사용자 정의 메시지를 제약 조건에서 바인드 해제합니다.

sp_unbindrule :

규직을 열이나 사용자 정의 데이터 유형에서 바인드 해제합니다.

sp_volchanged :

요청한 볼륨 처리를 덤프나 로드 중에 운영자가 수행했다는 것을 Backup Server™에 통보합니다.

sp_who :

모든 현재 Adaptive Server 사용자와 프로세스에 대한 정보, 특정 사용자 또는 프로세스에 대한 정보를 보고합니다.



테이블이 만들어졌으나 최대 행 크기(18642)가 행 당 최대 바이트 수(8060)를 초과합니다. 결과 행 길이가 8060바이트를 넘으면 이 테이블의 행에서 INSERT 또는 UPDATE가 실패합니다


 테이블 생성시 전체 행크기가 (8060)를 초과하여 나타나는 문제

Create Table 테이블명


id int,

QUESTION nvarchar (5000),

ANSWER nvarchar (5000),



오류 문구

테이블이 만들어졌으나 최대 행 크기(18642)가 행 당 최대 바이트 수(8060)를 초과합니다


변경하여 해결

            nvarchar (5000) => ntext  ,
           nvarchar (5000) => ntext  ,


※ 해당 문제가 발생하지 않도록 테이블 생성시 전체 행크기를 고려하여 설계 하여야 한다


컬럼 길이의 총 합이 페이지 크기를 넘어설 때 발생하는 경고.

이러한 경우 테이블은 생성되나 실제 데이터 insert 시에 한 개 이상의 컬럼에서 실 크기가 용량을 넘어서면 그때는 에러가 발생하면서 insert 가 안됨.


QUESTION 컬럼 뿐만 아니라 타 컬럼들의 사이즈도 다시 검토하여 불필요하게 사이즈를 늘려 잡는 일이 없도록 한다.

QUESTION 컬럼의 경우 무제한 입력 가능하게끔 설계하는것이라면 text 타입으로 설정.


데이터 타입에 N이 붙는 것은 유니코드 타입임.

다국어 지원이 아니라면 일반 타입을 사용.


펌 ++


View에는 몇게의 조인을 거쳐 생성된 Row들을 UNION시켜서 보여 주는 sql이 들어 있습니다.
새로 만들어 진건 아니고염... 계속 사용하던건데 Row겟수가 늘어 나면서 발생한 문제인것 같습니다.

OS는 Windows 2000 Server, DB는 예전에 7.0에서 사용하던 DB를 2000으로 옮겨서 사용 하고 있구염...
Select 되어질 총 Row수는 6000~7000이 입니다.

Error메세지는 다음과 같습니다.
크기가 8306인 행을 정렬할 수 없습니다. 최대 허용 크기(8094)를 초과했습니다.


행크기체크 ----------

에러 메세지를 잘 보시면 Row의 갯수가 많아서 에러가 나는 것이 아니라, 행의 크기가 커서 에러가 나는 것입니다. 행의 크기가 8306이나 되기 때문에 에러가 나는 것입니다. MS SQL 서버가 내부적으로 정렬을 할 수 있는 크기는 8000 바이트 정도 입니다. 이보다 크게 되면 정렬을 할 수 없습니다.

UNION의 경우 동일한 결과는 한번만 보이는 기능이 있으므로 내부적으로 GROUP BY 가 수행됩니다. 이를 위해 역시 내부적인 정렬이 이루어 집니다. 이 때문에 쿼리문에서 ORDER BY를 사용하지 않더라도 내부적인 ORDER BY 때문에 행의 크기가 너무 커 UNION이 되지 못하는 것입니다.

동일한 내용을 갖는 행이 없다고 한다면 UNION 대신 UNION ALL을 사용하면 에러가 나지 않을 것입니다.
확인해 보세요.



메모리 늘이는 방법 ----------

min memory per query 옵션
min memory per query 옵션을 사용하여 쿼리 실행을 위해 할당할 최소 메모리 양(KB)을 지정할 수 있습니다. 예를 들어, min memory per query를 2048KB로 설정하면 쿼리 실행 시 최소한 총 메모리만큼 얻을 수 있습니다. min memory per query를 512 - 2147483647KB(2GB)로 설정할 수 있습니다. 기본값은 1024KB입니다.

Microsoft® SQL Server™ 2000 쿼리 프로세서는 쿼리에 할당할 최적의 메모리 양을 결정하려 합니다. min memory per query 옵션을 사용하면 관리자가 단일 쿼리에서 수신할 최소 메모리 양을 지정합니다. 일반적으로 많은 양의 데이터에 대해 해시 및 정렬 작업을 수행하는 경우에는 쿼리가 이보다 더 많은 메모리를 수신합니다. min memory per query 값을 늘리면 작거나 중간 크기의 일부 쿼리의 성능이 향상되지만, 메모리 리소스의 경쟁이 심해질 수 있습니다. min memory per query에는 정렬을 위해 할당된 메모리를 포함하며 SQL Server 7.0 이전 버전의 sort pages 옵션을 바꿉니다.

min memory per query는 고급 옵션입니다. sp_configure 시스템 저장 프로세서를 사용하여 설정을 변경하면 show advanced options를 1로 설정할 때만 min memory per query를 바꿀 수 있습니다. 이 설정은 서버를 중지했다가 다시 시작하지 않아도 즉시 적용됩니다.

최소 쿼리 메모리를 설정하려면

엔터프라이즈 관리자

최소 쿼리 메모리를 설정하는 방법(엔터프라이즈 관리자)
최소 쿼리 메모리를 설정하려면 

서버 그룹을 확장합니다.

마우스 오른쪽 단추로 서버를 클릭한 다음 등록 정보를 클릭합니다.

메모리 탭을 클릭합니다.

최소 쿼리 메모리 상자에 512부터 2147483647KB 범위의 값을 입력하거나 선택합니다. 
기본값은 1024KB입니다.


USE master

       REPLACE(CONVERT(VARCHAR(20), CONVERT(MONEY,qs.total_worker_time / qs.execution_count/1000),1),'.00','') as [Avg CPU Time(ms)]
      ,substring (qt.text,
                  (case when qs.statement_end_offset = -1 then len (convert (nvarchar(max), qt.text)) * 2
                        else qs.statement_end_offset end - qs.statement_start_offset)/2) as query_text
  FROM sys.dm_exec_query_stats qs
       CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) as qt
       CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) as sq
       LEFT OUTER JOIN sys.databases as sd on qt.dbid = sd.database_id
       LEFT OUTER JOIN sys.dm_exec_requests as sr on qs.sql_handle = sr.sql_handle
       OUTER APPLY sys.fn_get_sql(sr.sql_handle) AS fs      
 ORDER BY qs.total_worker_time / qs.execution_count DESC


    te.name AS eventtype
FROM sys.fn_trace_gettable
        SELECT TOP 1
        FROM sys.fn_trace_getinfo(NULL) 
        WHERE property = 2
) T
INNER JOIN sys.trace_events as te
    ON t.eventclass = te.trace_event_id
--WHERE eventclass=164
where T.ObjectName='프로시저명'


흔히 테이블 명칭은 SQL Management 에서 테이블 디자이너로 수정을 하게되지만

sp_rename 프로시저를 이용하는 방법도 있다.

EXEC sp_rename '테이블명.컬럼명','바꿀이름','COLUMN'

ex) test_jun 테이블의 NAME 컬럼의 이름을 NAME2 로변경하고자 할때

​exec sp_rename 'test_jun.NAME' ,'NAME2','COLUMN' 




sp_xml_preparedocument (Transact-SQL)

THIS TOPIC APPLIES TO:yesSQL Server (starting with 2008)noAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

Reads the XML text provided as input, parses the text by using the MSXML parser (Msxmlsql.dll), and provides the parsed document in a state ready for consumption. This parsed document is a tree representation of the various nodes in the XML document: elements, attributes, text, comments, and so on. +

sp_xml_preparedocument returns a handle that can be used to access the newly created internal representation of the XML document. This handle is valid for the duration of the session or until the handle is invalidated by executing sp_xml_removedocument. +


A parsed document is stored in the internal cache of SQL Server. The MSXML parser uses one-eighth the total memory available for SQL Server. To avoid running out of memory, run sp_xml_removedocument to free up the memory. +


For backwards compatibility, sp_xml_preparedocument collapses the CR (char(13)) and LF (char(10)) characters in attributes even if these characters are entitized. +


The XML parser invoked by sp_xml_preparedocument can parse internal DTDs and entity declarations. Because maliciously constructed DTDs and entity declarations can be used to perform a denial of service attack, we strongly recommend that users not directly pass XML documents from untrusted sources to sp_xml_preparedocument. +

To mitigate recursive entity expansion attacks, sp_xml_preparedocument limits to 10,000 the number of entities that can be expanded underneath a single entity at the top level of a document. The limit does not apply to character or numeric entities. This limit allows documents with many entity references to be stored, but prevents any one entity from being recursively expanded in a chain longer than 10,000 expansions. +


sp_xml_preparedocument limits the number of elements that can be open at one time to 256. +

|Applies to: SQL Server ( SQL Server 2008 through current version).| +

Topic link icon Transact-SQL Syntax Conventions +



[ , xmltext ]  
[ , xpath_namespaces ]   


Is the handle to the newly created document. hdoc is an integer. +

[ xmltext ]
Is the original XML document. The MSXML parser parses this XML document. xmltext is a text parameter: char, nchar, varchar, nvarchar, text, ntext or xml. The default value is NULL, in which case an internal representation of an empty XML document is created. +


sp_xml_preparedocument can only process text or untyped XML. If an instance value to be used as input is already typed XML, first cast it to a new untyped XML instance or as a string and then pass that value as input. For more information, see Compare Typed XML to Untyped XML. +

[ xpath_namespaces ]
Specifies the namespace declarations that are used in row and column XPath expressions in OPENXML. xpath_namespaces is a text parameter: char, nchar, varchar, nvarchar, text, ntext or xml. +

The default value is <root xmlns:mp="urn:schemas-microsoft-com:xml-metaprop">. xpath_namespaces provides the namespace URIs for the prefixes used in the XPath expressions in OPENXML by means of a well-formed XML document. xpath_namespaces declares the prefix that must be used to refer to the namespace urn:schemas-microsoft-com:xml-metaprop; this provides metadata about the parsed XML elements. Although you can redefine the namespace prefix for the metaproperty namespace by using this technique, this namespace is not lost. The prefix mp is still valid for urn:schemas-microsoft-com:xml-metaprop even if xpath_namespaces contains no such declaration. +

Return Code Values

0 (success) or >0 (failure) +


Requires membership in the public role. +


A. Preparing an internal representation for a well-formed XML document

The following example returns a handle to the newly created internal representation of the XML document that is provided as input. In the call to sp_xml_preparedocument, a default namespace prefix mapping is used. +

DECLARE @hdoc int;  
DECLARE @doc varchar(1000);  
SET @doc ='  
<Customer CustomerID="VINET" ContactName="Paul Henriot">  
   <Order CustomerID="VINET" EmployeeID="5" OrderDate="1996-07-04T00:00:00">  
      <OrderDetail OrderID="10248" ProductID="11" Quantity="12"/>  
      <OrderDetail OrderID="10248" ProductID="42" Quantity="10"/>  
<Customer CustomerID="LILAS" ContactName="Carlos Gonzlez">  
   <Order CustomerID="LILAS" EmployeeID="3" OrderDate="1996-08-16T00:00:00">  
      <OrderDetail OrderID="10283" ProductID="72" Quantity="3"/>  
--Create an internal representation of the XML document.  
EXEC sp_xml_preparedocument @hdoc OUTPUT, @doc;  
-- Remove the internal representation.  
exec sp_xml_removedocument @hdoc;  

B. Preparing an internal representation for a well-formed XML document with a DTD

The following example returns a handle to the newly created internal representation of the XML document that is provided as input. The stored procedure validates the document loaded against the DTD included in the document. In the call to sp_xml_preparedocument, a default namespace prefix mapping is used. +

DECLARE @hdoc int;  
DECLARE @doc varchar(2000);  
SET @doc = '  
<?xml version="1.0" encoding="UTF-8" ?>   
<!DOCTYPE root   
[<!ELEMENT root (Customers)*>  
<!ELEMENT Customers EMPTY>  
<!ATTLIST Customers CustomerID CDATA #IMPLIED ContactName CDATA #IMPLIED>]>  
<Customers CustomerID="ALFKI" ContactName="Maria Anders"/>  

EXEC sp_xml_preparedocument @hdoc OUTPUT, @doc;  

C. Specifying a namespace URI

The following example returns a handle to the newly created internal representation of the XML document that is provided as input. The call to sp_xml_preparedocument preserves the mp prefix to the metaproperty namespace mapping and adds the xyz mapping prefix to the namespace urn:MyNamespace. +

DECLARE @hdoc int;  
DECLARE @doc varchar(1000);  
SET @doc ='  
<Customer CustomerID="VINET" ContactName="Paul Henriot">  
   <Order CustomerID="VINET" EmployeeID="5"   
      <OrderDetail OrderID="10248" ProductID="11" Quantity="12"/>  
      <OrderDetail OrderID="10248" ProductID="42" Quantity="10"/>  
<Customer CustomerID="LILAS" ContactName="Carlos Gonzlez">  
   <Order CustomerID="LILAS" EmployeeID="3"   
      <OrderDetail OrderID="10283" ProductID="72" Quantity="3"/>  
--Create an internal representation of the XML document.  
EXEC sp_xml_preparedocument @hdoc OUTPUT, @doc, '<ROOT xmlns:xyz="urn:MyNamespace"/>';  

See Also

XML Stored Procedures (Transact-SQL)
System Stored Procedures (Transact-SQL)
sp_xml_removedocument (Transact-SQL)
OPENXML (Transact-SQL)

메일을 보내는 명령은 아래와 같다 아마 설명은 필요없을듯.


EXEC msdb.dbo.sp_send_dbmail
    @profile_name = 'naver',
    @recipients = 'junijuniya@naver.com', --받는사람메일주소
    @body = 'The stored procedure finished successfully.', -- 메일내용
    @subject = 'Automated Success Message' ; --메일제목


실행해 보면

메시지 15281, 수준 16, 상태 1, 프로시저 sp_send_dbmail, 줄 0
구성 요소 'Database Mail XPs'이(가) SQL Server 보안 구성의 일부로 해제되었으므로 이 구성 요소의 프로시저 'dbo.sp_send_dbmail'에 대한 액세스가 차단되었습니다. 시스템 관리자는 sp_configure를 사용하여 'Database Mail XPs'의 사용을 활성화할 수 있습니다. 'Database Mail XPs' 활성화 방법은 SQL Server 온라인 설명서의 "노출 영역 구성"을 참조하십시오.

위와 같은 메세지가 뜬다. 메일 보내는 프로시저를 사용할수 있도록 활성화 해야하라는 말이다.



1. 프로시저 활성화


활성화 방법은.. 아래


sp_configure 'show advanced options', 1;
sp_configure 'Database Mail XPs', 1;


참고 : http://msdn.microsoft.com/ko-kr/library/ms191189.aspx


//노출영역도 설정해야한다.(일단패스)

여기까지 하고 실행을 하면 profile_name 에 대한 오류가 발생된다.

이건 보내는 사람에 대한 설정을 하라는 말이다.



2. 계정 및 프로필 설정


EXECUTE msdb.dbo.sysmail_add_account_sp
    @account_name = 'naver',
    @description = 'Mail account for administrative e-mail.',
    @email_address = 'junijuniya@naver.com',
    @replyto_address = 'junijuniya@naver.com',
    @display_name = 'kangjun',

    @password ='12341234'
    @mailserver_name = 'smtp.naver.com' ;


참고 : http://msdn.microsoft.com/ko-kr/library/ms187605.aspx



3. 데이터베이스에 메일 프로필 추가


EXECUTE msdb.dbo.sysmail_add_profile_sp
    @profile_name = 'naver',
    @description = 'Profile used for administrative mail.' ;



4. 데이터베이스 메일 프로필에 추가된 메일 프로필 추가


EXECUTE msdb.dbo.sysmail_add_profileaccount_sp
    @profile_name = 'naver',
    @account_name = 'naver',
    @sequence_number =1 ;



5. 메일 프로필 사용권한 부여


EXECUTE msdb.dbo.sysmail_add_principalprofile_sp
    @profile_name = 'naver',
    @principal_name = 'public',
    @is_default = 1 ;



위 다섯가지 작업을 한후 다시 처음에 있던


EXEC msdb.dbo.sp_send_dbmail
    @profile_name = '',
    @recipients = 'junijuniya@naver.com',
    @body = 'The stored procedure finished successfully.',
    @subject = 'Automated Success Message' ;


실행하면 메일이 발송된다.


참고 : http://msdn.microsoft.com/ko-kr/library/ms190307(v=sql.100).aspx

+ Recent posts