프론트엔드 면접 문제 은행

Posted by 나에요임마
2018. 4. 17. 11:30 Program/Front End

이 파일에는 잠재적인 프론트엔드 개발자 후보를 선정할 때 사용할 수 있는 여러 가지 면접 질문들이 있습니다. 후보자에게 모든 문제를 사용하는 것은 많은 시간이 소요되기 때문에 추천하지 않습니다. 대신, 여러분이 요구하는 주요 기술과 관련된 질문들을 몇 가지 선정해서 사용해보세요.

참고: 여기 있는 많은 질문은 자유롭게 추가/수정/삭제될 수 있고 정답보다 그 사람의 능력에 관해 이야기하는 흥미로는 토론을 끌어낼 수 있다는 것을 기억하세요.

목차

  1. 일반적인 질문
  2. HTML 관련 질문
  3. CSS 관련 질문
  4. JS 관련 질문
  5. 테스트 관련 질문
  6. 성능 관련 질문
  7. 코딩 관련 질문

함께하기

  1. 함께하는 분들
  2. 함께하는 방법
  3. 라이선스

일반적인 질문:

  • 어제/이번 주에 무엇을 공부하셨나요?
  • 코딩을 할 때 당신을 들뜨게 하거나 흥미를 끄는 것들은 무엇은 가요?
  • 최근에 당신이 경험한 기술적인 문제는 무엇이고 그것을 어떻게 해결했나요?
  • 웹 애플리케이션이나 사이트를 만들 때 고려해야 할 UI, Security, Performance, SEO, Maintainability에 대해서 설명해주세요.
  • 선호하는 개발 환경에 대해 자유롭게 이야기해 주세요.
  • 버전 관리 시스템은 어떤 것들을 사용해보셨습니까?
  • 당신이 웹 페이지를 만들 때의 과정을 설명해주실 수 있을까요?
  • 당신에게 5가지 다른 stylesheet가 있습니다. 어떤 방법으로 사이트에 제공하는 게 가장 효과적일까요?
  • 점진적 향상법(progressive enhancement)과 우아한 성능저하법(graceful degradation)의 차이를 설명하실 수 있습니까?
  • 웹사이트에서 assets/resources를 최적화하는 방법에 관해 설명해주세요.
  • 브라우저가 한 번에 1개의 도메인에서 내려받는 자원은 몇 개인가요?
    • 예외에는 어떤 것들이 있나요?
  • 페이지 로드 시간을 줄이는 세 가지 방법에 관해서 이야기 해 보세요.
  • 당신이 프로젝트에 합류했습니다. 근데 그들은 Tab을 이용하고, 당신은 Sapce를 사용했습니다. 어떻게 하실 건가요?
  • 간단한 Slideshow 페이지를 만드는 방법에 관해서 이야기해 보세요.
  • 만약 당신이 올해 기술적 책임자가 되었다면 무엇을 먼저 하시겠습니까?
  • 표준의 중요성에 관해 설명해주세요.
  • Flash of Unstyled Content에 관해 설명해주세요. 또 FOUC를 피하기 위해선 어떻게 해야 하나요?
  • ARIA와 screenreader에 대해 설명해주세요. 또 접근성을 지원하는 웹사이트를 어떻게 만드는지에 대해도 설명해주세요.
  • CSS 애니메이션과 JavaScript 애니메이션의 차이점에 관해 설명해주세요.
  • CORS는 무엇의 약자이고 어떤 문제에 대해서 언급하는 것인가요?

HTML 관련 질문:

  • doctype이 무엇을 하는 것인가요?
  • 표준모드(standards mode)와 쿽스모드(quirks mode)의 다른 점은 무엇인가요?
  • XML과 XHTML의 다른 점은 무엇인가요
  • XHTML을 이용한 페이지의 한계점은 무엇이 있나요?
  • application/xhtml+xml으로 지정한 페이지에 어떠한 문제가 있나요?
  • 다국어가 포함된 페이지는 어떤 방식으로 제공하나요?
  • 다국어 페이지를 제공하는 여러 방법에 관해 설명해주세요.
  • data-속성은 무엇을 하는 것인가요? 사용했을 때 이점은 무엇인가요?
  • HTML5를 오픈 웹 플랫폼(open web platform)으로 생각해본다면, 어떤 것들로 구성돼 있을까요?
  • 쿠키(Cookies)와 세션저장소(sessionStorage)와 로컬저장소(localStorage)의 차이점을 설명해주세요.
  • <script><script async>와 <script defer>의 차이점에 관해 설명해주세요.
  • CSS<link>를 <head></head>사이에 쓰는 것과 JS<script>를 <body></body>뒤에 사용하는 것은 좋은 사용법일까요? 어디에 배치하는 게 좋을까요?
  • Progressive rendering이란 무엇인가요?
  • 이미지 태그에 srcset 속성을 사용하는 이유는 무엇인가요? 브라우저가 이 속성을 가진 콘텐츠를 평가할 때 사용하는 과정을 설명해보세요.
  • HTML templating language를 사용해 본 경험이 있나요?

CSS 관련 질문:

  • class와 id의 차이점에 관해서 설명해주세요.
  • "reset" CSS가 무엇인지, 어떻게 유용한지 설명해주세요.
  • Floats가 어떻게 동작하는지 설명해주세요.
  • z-index에 관해 설명해주세요.
  • BFC(Block Formatting Context)에 관해 설명해주세요
  • 클리어링(Clearing) 기술에는 어떤 것들이 있으며, 어떨 때 어떻게 사용하는 것이 적절한지 설명하세요.
  • CSS 스프라이트(CSS Sprites)를 설명하고, 페이지나 사이트를 어떻게 향상하는지 설명하세요.
  • Image Replacement를 사용해야 할 때, 선호하는 기술과 언제 사용하는지를 설명해주세요.
  • 브라우저 스펙 차이에 따른 스타일링 이슈를 수정하기 위해서 어떻게 접근하나요?
  • 기능이 제약된 브라우저를 위해서 어떤 방식으로 페이지를 만드나요?
    • 어떠한 기술과 절차를 거치는지 설명하세요.
  • 시각적으로 보이지 않고 스크린 리더에서만 가능하게 하는 방법에 관해 설명해주세요.
  • 그리드 시스템(Grid system)을 사용한 적이 있나요? 있다면 어떠한 것을 선호하나요?
  • 미디어 쿼리(media queries)를 사용한 적이 있나요? 혹은 모바일에 맞는 layout과 CSS를 사용한 적이 있나요?
  • SVG를 스타일링하는데 익숙하신가요?
  • 인쇄하기 위해 웹페이지를 어떻게 최적화 하나요?
  • 효율적인 CSS를 작성하기 위한 "비법(gotchas)"은 어떤 게 있나요?
  • CSS 전처리(CSS preprocessors)를 사용해보셨나요?
    • 그렇다면, 사용 경험에 기반을 둬 좋았던 점과 나빴던 점을 설명해주세요.
  • 페이지에서 표준 폰트가 아닌 폰트 디자인을 사용할 때 어떤 방식으로 처리하시나요? (웹폰트를 제외하고)
  • CSS Selector가 어떠한 원리로 동작하는지 설명해주세요.
  • pseudo-elements에 관해서 설명하고 어디에서 사용되는지 이야기해보세요.
  • box model에 관해 설명하고 브라우저에서 어떻게 동작하는지 설명해주세요.
  • * { box-sizing: border-box; }은 무엇이고 사용했을때 이점은 무엇인가요?
  • 기억나는 display 속성에 대한 값들을 나열해보세요.
  • inline과 inline-block의 차이점은 무엇인가요?
  • 요소를 배치하는 방법(relative, fixed, absolute, static) 간의 차이는 무엇인가요?
  • CSS에서 'C'는 Cascading을 의미합니다. Cascading에 관해서 설명해주세요. 또 cascading system의 장점은 무엇인가요?
  • CSS framework를 사용해본 적이 있으신가요? 실무에서 사용해보았다면 어떤 이점이 있었나요?
  • 새로운 CSS Flexbox 혹은 Grid 스펙을 사용해 보신 적 있나요?
  • 반응형(Responsive) 디자인은 적응형(Adaptive) 디자인과 어떤 차이점이 있나요?
  • 레티나 그래픽 환경에서 작업해 보신 적이 있나요? 하셨다면 어떤 기술을 사용하셨나요?
  • 절대 좌표대신 translate() 혹은 반대로 사용하는 이유가 있나요? 있다면 이유에 관해서 설명해주세요.

JS 관련 질문:

  • event delegation에 관해 설명해주세요.
  • this는 JavaScript에서 어떻게 작동하는지 설명해주세요.
  • prototype 기반 상속은 어떻게 하는지 설명해주세요.
  • AMD와 CommonJS는 무엇이고, 이것들에 대해 어떻게 생각하시나요?
  • 다음 코드가 즉시 호출 함수 표현식(IIFE)로 동작하지 않는 이유에 관해서 설명해보세요: function foo(){ }();.
    • IIFE로 만들기 위해서는 어떻게 해야 하나요?
  • null과 unedefined 그리고 undeclared의 차이점은 무엇인가요?
    • 두개를 구분하기 위해서는 어떻게 하면 될까요?
  • 클로져(Closure)는 무엇이며, 어떻게/왜 사용하는지 설명해주세요.
    • 클로져를 만들 때 선호하는 패턴은 무엇인가요? argyle (IIFEs에만 적용할 수 있다)
  • 익명함수(anonymous functions)는 주로 어떤 상황에서 사용하나요?
  • 당신의 코드를 어떻게 구성하는지? (모듈 패턴, 전통적 상속)
  • 호스트 객체(Host Objects)와 네이티브 객체(Native Objects)의 차이점은 무엇인가요?
  • 다음 코드의 차이점은 무엇인가요?
function Person(){} var person = Person() var person = new Person()
  • .call과 .apply의 차이점은 무엇인가요?
  • Function.prototype.bind을 설명하세요.
  • document.write()는 언제 사용하나요?
  • UA 문자열을 이용하여 기능 검출(feature detection)과 기능 추론(feature inference)의 차이점을 설명하세요.
  • AJAX에 관해 가능한 한 자세히 설명하세요.
  • AJAX를 사용했을 때의 장단점에 대해 설명해주세요.
  • JSON이 어떻게 동작 되는지 설명하세요. (그리고 AJAX와 어떻게 다른지 설명하세요.)
  • 기존에 JavaScript 템플릿을 사용한 적이 있나요? 만약에 있다면, 어떠한 방식으로 사용했는지 말씀해주세요.
  • "호이스팅(Hoisting)"에 대해서 설명하세요.
  • 이벤트 버블링(Event Bubbling)에 대해서 설명하세요.
  • "속성(Attribute)"와 "요소(property)"의 차이가 무엇인가요?
  • 내장된 JavaScript 객체를 확장하는 것이 좋지 않은 이유는 무엇인가요?
  • docuemnt load event와 DOMContentLoaded event의 차이점은 무엇인가요?
  • ==와 ===의 차이점은 무엇인가요?
  • JavaScript의 "동일출처정책(the same-origin policy)"에 대해서 설명하세요.
  • 다음 코드를 동작하게 만드세요.
duplicate([1,2,3,4,5]); // [1,2,3,4,5,1,2,3,4,5]
  • 삼항식(Ternary statement)을 사용하는 이유는 무엇이고, 그것을 표현하기 위한 연산자 단어는 무엇인가요?
  • use strict;은 무엇이고, 사용했을 때 장단점에 관해서 설명해주세요.
  • 100번 반복되는 반복문이 있습니다. 3의 배수일 때는 fizz, 5의 배수일 때는 buzz, 3과 5의 공배수일 때는 fizzbuzz가 출력되는 코드를 작성해보세요.
  • 전역 scope를 사용했을 때 장단점에 관해 설명해주세요.
  • 때때로 load event를 사용하는 이유에 관해 설명해주세요. 또 단점이 있다면 대안에 대해서도 설명해주세요.
  • SPA에서 SEO에 유리하도록 만들기 위한 방법에 대해 설명해주세요.
  • Promise를 사용해 본 경험이 있나요?
  • Promise가 콜백 대비 장/단점은 무엇인지 설명해주세요.
  • JavaScript의 작동방식의 장단점에 관해 설명해주세요.
  • JavaScript를 디버깅할 때 사용하는 도구가 있으면 설명해주세요.
  • 객체 안의 속성과 배열의 아이템을 순회할 때 사용하는 문법에 관해 설명해주세요.
  • mutable object와 immutable object에 관해 설명해주세요.
    • JavaScript에서 immutable 객체의 예를 들어보세요.
    • immutability의 장/단점은 무엇인가요?
    • 자신의 코드에서 불변성(immutability를) 어떻게 달성할 수 있나요?
  • 동기방식과 비동기 방식 함수의 차이에 관해서 설명해주세요.
  • event loop이란 무엇인가요?
    • call stack과 task queue에 관해 설명해주세요.
  • function foo() {}와 var foo = function() {}에서 foo 의 차이가 무엇인지 설명해보세요.
  • letvarconst의 차이점에 관해서 설명해주세요.

테스트 관련 질문들:

  • test code를 작성하면서 개발하는 방식의 장점과 단점에 대해 설명해주세요.
  • test code를 테스트하는 툴을 사용해보신 경험이 있나요?
  • 유닛 테스트와 함수테스트의 차이점은 무엇인가요?
  • code style linting tool을 사용했을때 장점은 무엇인가요?

성능 관련 질문들:

  • 성능관련 이슈들을 발견하기 위해서 사용하는 방법은 무엇인가요?
  • 웹사이트 scrolling 성능을 향상시키기 위한 몇가지 방법에 대해 설명해보세요.
  • 브라우저의 layout, painting, compositing에 대해 설명해보세요.

네트워크 질문들:

  • 전통적으로, 웹사이트의 assets을 여러 도메인으로 서빙했을 때 장점은 무엇인가요?
  • URL로 접속했을 때 어떤 플로우로 화면에 웹사이트가 그려지는지 네트워크 관점에서 설명해주세요.
  • Long-Polling과 Websocket, Server-Sent Event에 대해 설명해주세요.
  • 다음 request header들에 대해 설명해주세요.
    • Diff. between Expires, Date, Age and If-Modified-...
    • Do Not Track
    • Cache-Control
    • Transfer-Encoding
    • ETag
    • X-Frame-Options
  • HTTP와 HTTPS에 대해 설명해주세요.
  • HTTP Method들에 대해 설명해주세요.

코딩 질문:

질문: foo의 값은 무엇인가요?

var foo = 10 + '20';

질문: 아래 코드의 결과값은 무엇인가요?

console.log(0.1 + 0.2 == 0.3);

질문: 아래 코드가 동작하게 하기 위해선 어떻게 해야할까요?

add(2, 5); // 7
add(2)(5); // 7

질문: 아래 구문의 반환값은 무엇인가요?

"i'm a lasagna hog".split("").reverse().join("");

Question: What is the value of window.foo? 질문: window.foo의 값은 무엇인가요?

( window.foo || ( window.foo = "bar" ) );

질문: 아래 두 alert의 결과값은 무엇인가요?

var foo = "Hello";
(function() {
  var bar = " World";
  alert(foo + bar);
})();
alert(foo + bar);

질문: foo.length의 값은 무엇인가요?

var foo = [];
foo.push(1);
foo.push(2);

질문: foo.x의 값은 무엇인가요?

var foo = {n: 1};
var bar = foo;
foo.x = foo = {n: 2};

질문: 아래 코드의 출력값은 무엇인가요?

console.log('one');
setTimeout(function() {
  console.log('two');
}, 0);
console.log('three');

그 외 흥미로운 질문들:

  • 최근에 수행했던 흥미로운 프로젝트는 무엇인가요?
  • 사용하는 개발 도구에서 마음에 드는 부분은 무엇인가요?
  • 프론트엔드 커뮤니티에서 당신에게 영감을 준 사람이 있다면 누구인가요?
  • 애완동물 관련 프로젝트를 해 보았나요? 해보았다면 어떤 종류의 프로젝트인가요?
  • IE에서 가장 좋아하는 기능은 무엇인가요?
  • 어떤 커피를 좋아하시나요?

함께하는 분들:

이 문서는 2009년에 다음에 언급된 분들과의 협업으로 시작했습니다. @paul_irish @bentruyman @cowboy @ajpiano@SlexAxton @boazsender @miketaylr @vladikoff @gf3 @jon_neal @sambreed @iansym

현재는 100이 넘는 개발자들이 함께하고 있습니다.

'Program > Front End' 카테고리의 다른 글

🚀⚙️ JavaScript Visualized: the JavaScript Engine  (0) 2020.01.27
크롬 개발자 도구 101  (0) 2019.01.07

MSSQL DBA가 알아야하는 것들 모음

Posted by 나에요임마
2018. 4. 17. 11:26 Program/MSSQL

/************************************************************************************************

** DBA 관리용 시스템 프로시저 생성

drop proc sp_table0

drop proc sp_column0

drop proc sp_block0

drop proc sp_server0

drop proc sp_dboption0

drop proc sp_filegroup0

drop proc sp_lock0

drop proc sp_index0

drop proc sp_filepageno0

drop proc sp_constraint0

drop proc sp_trigger0

drop proc sp_converthex0

drop proc sp_spaceused0

drop proc sp_rowlength0

drop proc sp_freedisksize0

drop proc sp_object0

drop prco sp_showcontig0

************************************************************************************************/



/************************************************************************************************

-- sp_table0

-- 디폴트로 유저 테이블을, 그외 시스템과 뷰를 보여준다.

-- 파라미터로는 'system','view','all'이 있다.

************************************************************************************************/

USE master

GO


IF OBJECT_ID('sp_table0') IS NOT NULL

   DROP PROCEDURE sp_table0

GO


CREATE PROC sp_table0    

  @table_type VARCHAR(100) = NULL  

AS

  SET NOCOUNT ON


  DECLARE @owner SYSNAME

  DECLARE @name SYSNAME

  DECLARE @oid INT

  DECLARE @type CHAR(2)     

  DECLARE @pages INT

  DECLARE @dbname SYSNAME

  DECLARE @dbsize DEC(15,0)

  DECLARE @logsize DEC(15)

  DECLARE @bytesperpage DEC(15,0)

  DECLARE @pagesperMB DEC(15,0)

  DECLARE @sql VARCHAR(1000)


  IF (OBJECT_ID('#return_tbl') IS NOT NULL)

  BEGIN

     DROP TABLE #return_tbl

  END


  CREATE TABLE #return_tbl

  ( owner SYSNAME NOT NULL

  , name SYSNAME NOT NULL

  , id INT NOT NULL

  , type VARCHAR(10) NOT NULL

  , filegroup SYSNAME NOT NULL

  , rows VARCHAR(100) NULL

  , reserved DEC(15,0) NULL

  , data DEC(15,0) NULL

  , indexp DEC(15,0) NULL

  , unused DEC(15,0) NULL

  )


  IF @table_type IS NULL  

  BEGIN  

    -- 기본 테이블 정보 --

    INSERT INTO #return_tbl (owner, name, id, type, filegroup)

    SELECT u.name "owner", o.name "name", o.id "id" ,'user' "type", f.groupname "filegroup"

    FROM sysusers u INNER JOIN sysobjects o  

                          ON u.uid = o.uid  

                    INNER JOIN sysindexes i

                          ON o.id = i.id

                    INNER JOIN sysfilegroups f

                          ON i.groupid = f.groupid

    WHERE xtype  = 'u'  

    AND i.indid < 2

    ORDER BY o.name 


    -- 테이블 spaceused 계산 시작

    DECLARE cur_tbl CURSOR 

    FOR SELECT owner, name, id

        FROM #return_tbl


    OPEN cur_tbl


    FETCH NEXT FROM cur_tbl

    INTO @owner, @name, @oid

    

    WHILE (@@fetch_status = 0)

    BEGIN

      /*******************************************************************/

        -- #return_tbl.reserved

        UPDATE #return_tbl

        SET reserved = (SELECT sum(reserved)

                        FROM sysindexes

                        WHERE indid in (0,1,255)

                        AND id = @oid

                       )

        WHERE CURRENT OF cur_tbl


        -- #return_tbl.data

        SELECT @pages = SUM(dpages)

        FROM sysindexes

        WHERE indid < 2

        AND id = @oid

        

        SELECT @pages = @pages + ISNULL(SUM(used), 0)

FROM sysindexes

WHERE indid = 255

AND id = @oid

 

        UPDATE #return_tbl

        SET data = @pages

        WHERE CURRENT OF cur_tbl


        -- #return_tbl.index

        UPDATE #return_tbl

        SET indexp = (SELECT SUM(used)

                      FROM sysindexes

                      WHERE indid IN (0,1,255)

                      AND id = @oid

                     ) - data

        WHERE CURRENT OF cur_tbl


        -- #return_tbl.unused

        UPDATE #return_tbl

        SET unused = reserved - (SELECT SUM(used)

                                 FROM sysindexes

                                 WHERE indid IN (0,1,255)

                                 AND id = @oid

                                )

        WHERE CURRENT OF cur_tbl

 

        -- #return_tbl.rows

        UPDATE #return_tbl

        SET rows = (SELECT rows

                    FROM sysindexes

                    WHERE indid < 2

                    AND id = @oid

                   )

        WHERE CURRENT OF cur_tbl

      /*******************************************************************/


      FETCH NEXT FROM cur_tbl

      INTO @owner, @name, @oid

    END


    CLOSE cur_tbl

 

    DEALLOCATE cur_tbl

    

    SELECT id "Id", owner "Owner", r.name "Name", filegroup "Filegroup", rows "Rows"

         , CAST(reserved * d.low / (1000*1024) AS DEC(15,2)) "Reserved(MB)"

         , CAST(data * d.low / (1000*1024) AS DEC(15,2)) "Data(MB)"

         , CAST(indexp * d.low / (1000*1024) AS DEC(15,2)) "Index(MB)"

         , CAST(unused * d.low / (1000*1024) AS DEC(15,2)) "Unused(MB)"

    FROM #return_tbl r, master.dbo.spt_values d

    WHERE d.number = 1

      AND d.type = 'E'

    ORDER BY filegroup, name 


  END  

  ELSE IF @table_type = 'system'  

  BEGIN  

    SELECT u.name "owner", o.name "name", 'system' "type"  

    FROM sysusers u INNER JOIN sysobjects o  

                               ON u.uid = o.uid  

    WHERE xtype  = 's'  

    ORDER BY o.name   

  END  

  ELSE IF @table_type = 'all'  

  BEGIN  

    SELECT u.name "owner", o.name "name",   

           CASE xtype   

                WHEN 'S' THEN 'system'  

                WHEN 'U' THEN 'user'  

                WHEN 'V' THEN 'view'  

           END "type"                  

    FROM sysusers u INNER JOIN sysobjects o  

                               ON u.uid = o.uid  

    WHERE xtype IN ('s', 'u', 'v')  

    ORDER BY xtype    

  END  

  ELSE IF @table_type = 'view'  

  BEGIN  

    SELECT u.name "owner", o.name "name", 'view' "type"  

    FROM sysusers u INNER JOIN sysobjects o  

                               ON u.uid = o.uid  

    WHERE xtype  = 'v'  

    ORDER BY o.name  

  END  

  ELSE  

  BEGIN  

    RAISERROR('''%s'' parameter is not valid...', 16, 1, @table_type)  

  

    RETURN(1)  

  END  

  

  DROP TABLE #return_tbl


  SET NOCOUNT OFF


  RETURN(0) --sp_table0


GO


EXEC sp_MS_marksystemobject 'sp_table0'

GO


GRANT EXECUTE ON sp_table0 TO PUBLIC

GO



/************************************************************************************************

-- sp_column0 'dbo.user_t'

-- 해당 테이블의 컬럼을 보여준다

-- 파라미터로는 테이블명을 입력해야 한다.

************************************************************************************************/

USE MASTER

GO


IF OBJECT_ID('sp_column0') IS NOT NULL

   DROP PROCEDURE sp_column0

GO


CREATE PROC sp_column0    

  @table_name VARCHAR(100) = null  

AS  

  SET NOCOUNT ON  

  

  DECLARE @errormsg VARCHAR(100)


  IF (@table_name IS NULL)  

  BEGIN  

    RAISERROR('''@table_name'' parameter is empty...', 16, 1, @table_name)      

  

    RETURN(1)  

  END  

  

  IF (CHARINDEX('.',@table_name) = 0)  

  BEGIN   

    IF NOT EXISTS (SELECT name   

                   FROM sysobjects   

                   WHERE name = @table_name  

                   AND xtype IN ('s', 'u')  

                  )  

    BEGIN  

      SET @errormsg = 'There isn''t ''%s'' table in ' + db_name()+ ' database...'


      RAISERROR(@errormsg, 16, 1, @table_name)  


      RETURN(1)  

    END  

  END  

  ELSE   

  BEGIN   

    IF NOT EXISTS (SELECT name  

                   FROM sysobjects   

                   WHERE name = RIGHT(@table_name,LEN(@table_name)

                                -CHARINDEX('.',@table_name))   

                   AND uid = USER_ID(LEFT(@table_name,LEN(@table_name) 

                             - (LEN(@table_name)-CHARINDEX('.',@table_name)) - 1))  

                   AND xtype IN ('s', 'u')  

                  )  

    BEGIN  

      SET @errormsg = 'There isn''t ''%s'' table in ' + db_name()+ ' database...'


      RAISERROR(@errormsg, 16, 1, @table_name)  

  

      RETURN(1)  

    END  

  END  

  

  SELECT c.name "col_name", t.name "type", c.length "length", c.isnullable "nullable"  

  FROM syscolumns c INNER JOIN systypes t  

                    ON c.xusertype = t.xusertype  

  WHERE c.id = OBJECT_ID(@table_name)

  

  RETURN(0) --sp_column0

  

  SET NOCOUNT OFF


GO


GRANT EXECUTE ON sp_column0 TO PUBLIC

GO



/************************************************************************************************

-- sp_block0

-- 블러킹 대상과 블러킹된 대상리스트, BUFFER내의 데이터를 보여준다.

************************************************************************************************/

USE MASTER

GO


IF OBJECT_ID('sp_block0') IS NOT NULL

   DROP PROCEDURE sp_block0

GO


CREATE PROC sp_block0    

AS

  SET NOCOUNT ON  

  SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED


  -- 처음 결과 시작

  DECLARE @probclients TABLE(spid SMALLINT

                            , ecid SMALLINT

                            , blocked SMALLINT

                            , waittype BINARY(2)

                            , dbid SMALLINT

                            , ignore_app TINYINT

                            , PRIMARY KEY (blocked, spid, ecid)

                            )

  

  INSERT @probclients 

  SELECT spid, ecid, blocked, waittype, dbid

  ,      CASE WHEN CONVERT(VARCHAR(128),hostname) = 'PSSDIAG' THEN 1 

              ELSE 0 

         END

  FROM sysprocesses 

  WHERE blocked!=0 

    OR waittype != 0x0000

  

  INSERT @probclients 

  SELECT DISTINCT blocked, 0, 0, 0x0000, 0, 0 

  FROM @probclients

  WHERE blocked NOT IN (SELECT spid 

                        FROM @probclients

                       ) 

  and blocked != 0

  

  SELECT spid, status, blocked, open_tran, waitresource, waittype

       , waittime, cmd, lastwaittype, cpu, physical_io

       , memusage, last_batch=CONVERT(VARCHAR(26), last_batch,121)

       , logIN_time=CONVERT(VARCHAR(26), logIN_time,121),net_address

       , net_library, dbid, ecid, kpid, hostname, hostprocess

       , loginame, program_name, nt_domain, nt_username, uid, sid

       , sql_handle, stmt_start, stmt_end

  FROM master..sysprocesses

  WHERE blocked!=0 

  OR waittype != 0x0000

  OR spid IN (SELECT blocked 

              FROM @probclients 

              WHERE blocked != 0

             )

  OR spid IN (SELECT spid 

              FROM @probclients 

              WHERE blocked != 0

             )

  -- 처음 결과 끝


  -- 두번째 결과 시작

  DECLARE @spid INT

  DECLARE @msg VARCHAR(100)

  

  CREATE TABLE #infoevent(id INT IDENTITY

                         , spid INT

                         , eventtype VARCHAR(255)

                         , parameters INT

                         , eventinfo VARCHAR(255)

                         )


  DECLARE cur_infoevent CURSOR READ_ONLY

  FOR SELECT spid

      FROM @probclients


  OPEN cur_infoevent


  FETCH NEXT FROM cur_infoevent

  INTO @spid


  WHILE (@@fetch_status = 0)

  BEGIN

    SET @msg = 'dbcc inputbuffer (' + CONVERT(VARCHAR(20), @spid) + ')'  


    INSERT #infoevent (eventtype, parameters, eventinfo)

    EXEC (@msg)


    UPDATE #infoevent

    SET spid = @spid

    WHERE id = @@identity


    FETCH NEXT FROM cur_infoevent

    INTO @spid

  END


  CLOSE cur_infoevent


  DEALLOCATE cur_infoevent


  SELECT * from #infoevent

  

  DROP TABLE #infoevent

  -- 두번째 결과 끝


  -- 세번째 결과 시작

  SELECT CONVERT (SMALLINT, req_spid) As spid

       , rsc_dbid As dbid

       , db_name(rsc_dbid) As dBName

       , rsc_objid As ObjId                       

       , rsc_indid As IndId

       , substring (v.name, 1, 4) As Type

       , substring (rsc_text, 1, 16) as Resource

       , substring (u.name, 1, 8) As Mode

       , substring (x.name, 1, 5) As Status

  INTO #BlockLock_t

  FROM master.dbo.syslockinfo,

       master.dbo.spt_values v,

       master.dbo.spt_values x,

       master.dbo.spt_values u

  WHERE master.dbo.syslockinfo.rsc_type = v.number

    and v.type = 'LR'

    and master.dbo.syslockinfo.req_status = x.number

    and x.type = 'LS'

    and master.dbo.syslockinfo.req_mode + 1 = u.number

    and u.type = 'L'

    and req_spid in (SELECT spid 

                     FROM master..sysprocesses 

                     WHERE blocked = 0 and spid IN (SELECT blocked 

                                                    FROM master..sysprocesses

                                                   )

                    )


  CREATE TABLE #lockreturn_t

  ( spid SMALLINT

  , dbname SYSNAME

  , objname SYSNAME

  , indid SMALLINT

  , type VARCHAR(5)

  , resource VARCHAR(20)

  , mode VARCHAR(10)

  , status VARCHAR(5)

  )   

  

  DECLARE @dbid INT

  DECLARE @dbname SYSNAME

  DECLARE @sql VARCHAR(300)


  DECLARE cur_lockobject CURSOR 

  FOR 

    SELECT DISTINCT dbid, dbname

    FROM #BlockLock_t

    ORDER BY dbid

 

  OPEN cur_lockobject

 

  FETCH cur_lockobject INTO @dbid, @dbname

 

  WHILE @@fetch_status <> -1

  BEGIN

    IF @@fetch_status <> -2

    BEGIN

      SET @sql = 'select #BlockLock_t.spid, #BlockLock_t.dbname, a.name, '

      SET @sql = @sql + '#BlockLock_t.indid, #BlockLock_t.type, #BlockLock_t.resource, '

      SET @sql = @sql + '#BlockLock_t.mode, #BlockLock_t.status '

      SET @sql = @sql + 'FROM #BlockLock_t, '

      SET @sql = @sql + @dbname+'..sysobjects a  WHERE dbid = ' 

      SET @sql = @sql + CAST(@dbid AS VARCHAR(10)) 

      SET @sql = @sql + ' AND #BlockLock_t.ObjID = a.id ORDER BY spid'


      INSERT INTO #lockreturn_t EXEC(@sql)

    END


    FETCH cur_lockobject INTO @dbid, @dbname

  END


  SELECT * 

  FROM #lockreturn_t

  ORDER BY spid, dbname, objname


  CLOSE cur_lockobject

  DEALLOCATE cur_lockobject


  DROP TABLE #BlockLock_t

  DROP TABLE #lockreturn_t

  -- 세번째 결과 끝

  SET NOCOUNT OFF


  RETURN(0) --sp_block0


GO

  

GRANT EXECUTE ON sp_block0 TO PUBLIC

GO



/************************************************************************************************

-- sp_server0

-- 서버의 기본 정보를 보여준다.

************************************************************************************************/

USE MASTER

GO


IF OBJECT_ID('sp_server0') IS NOT NULL

   DROP PROCEDURE sp_server0

GO


CREATE PROC sp_server0    

AS

  SET NOCOUNT ON


  SELECT SERVERPROPERTY('ServerName')     AS ServerName

  ,      SERVERPROPERTY('MachineName')    AS MachineName

  ,      SERVERPROPERTY('InstanceName')   AS InstanceName

  ,      SERVERPROPERTY('Edition')        AS Edition

  ,      SERVERPROPERTY('ProductVersion') AS ProductVersion

  ,      SERVERPROPERTY('ProductLevel')   AS ProductLevel

  

  EXEC master..xp_msver


  RETURN(0) --sp_server0


  SET NOCOUNT OFF


GO

  

GRANT EXECUTE ON sp_server0 TO PUBLIC

GO



/************************************************************************************************

-- sp_dboption0

-- 데이터베이스 설정 옵션을 보여준다.

-- 파라미넡가 null인 경우 전체 DB의 옵션을 보여준다.

************************************************************************************************/

USE MASTER

GO


IF OBJECT_ID('sp_dboption0') IS NOT NULL

   DROP PROCEDURE sp_dboption0

GO


CREATE PROC sp_dboption0

  @dbname SYSNAME = null

AS

  SET NOCOUNT ON


  DECLARE @errmsg VARCHAR(100)

  DECLARE @sql VARCHAR(1000)

  DECLARE @db VARCHAR(100)


  CREATE TABLE #return

  ( dbname SYSNAME NULL

  , options varchar(100) NULL

  )


  IF (@dbname IS NOT NULL) 

  BEGIN

    IF NOT EXISTS (SELECT name 

                   FROM master..sysdatabases

                   WHERE name = @dbname

                  )

    BEGIN

      SET @errmsg = 'There is no ''%s'' Database in this SQL Server...'   


      RAISERROR(@errmsg, 16,1, @dbname)


      RETURN(1)

    END

    ELSE

    BEGIN

      SET @sql = 'sp_dboption ''' + @dbname + ''''


      EXEC (@sql)

    END

  END

  ELSE

  BEGIN -- @dbname is null

    DECLARE cur_dboption CURSOR READ_ONLY

    FOR SELECT name

        FROM master..sysdatabases


    OPEN cur_dboption


    FETCH NEXT FROM cur_dboption

    INTO @db


    WHILE (@@fetch_status = 0)

    BEGIN

      SET @sql = 'sp_dboption ''' + @db + ''''


      INSERT #return (options)

      EXEC (@sql)


      UPDATE #return

      SET dbname = @db

      WHERE dbname IS NULL


      FETCH NEXT FROM cur_dboption

      INTO @db

    END  


    CLOSE cur_dboption


    DEALLOCATE cur_dboption


    SELECT *

    FROM #return


    DROP TABLE #return

  END

  

  RETURN(0) --sp_dboption0

  

  SET NOCOUNT OFF


GO

  

GRANT EXECUTE ON sp_dboption0 TO PUBLIC

GO



/************************************************************************************************

-- sp_filegroup0

-- 해당 DB의 파일&파일 그룹 정보를 보여준다.

-- 파라미터가 'all'일시 전체 DB의 파일&파일 그룹 정보를 보여준다.

************************************************************************************************/

USE master

GO


IF OBJECT_ID('sp_filegroup0') IS NOT NULL

   DROP PROCEDURE sp_filegroup0

GO


CREATE PROC sp_filegroup0    

  @param VARCHAR(5) = NULL

AS

  SET NOCOUNT ON


  IF (@param IS NOT NULL AND @param != 'all')

  BEGIN  

    RAISERROR('''@param'' parameter have to be NULL or ''all''...', 16, 1)      

  

    RETURN(1)  

  END  


  DECLARE @db_name SYSNAME

  DECLARE @cdbname SYSNAME

  DECLARE @sql VARCHAR(1000)

  DECLARE @dblist TABLE

  ( dbname SYSNAME

  )


  CREATE TABLE #result_tbl

  ( dbname SYSNAME

  , groupname VARCHAR(250)

  , filename VARCHAR(250)

  , filepath VARCHAR(250)

  , filesize DEC(15,2)

  )


  IF (@param = 'all')

     INSERT INTO @dblist

     SELECT name

     FROM master..sysdatabases

     WHERE name not in ('master','model','msdb','tempdb','pubs','northwind')

  ELSE

  BEGIN

     SET @db_name = db_name()


     IF NOT EXISTS (SELECT name

                    FROM master..sysdatabases

                    WHERE name = @db_name)

     BEGIN

        RAISERROR('There is no ''%s'' database in this SQL Server...', 16,1,@db_name)


        RETURN(1)

     END

     ELSE

       INSERT INTO @dblist

       VALUES (@db_name)

  END


  DECLARE cur_dblist CURSOR FOR 

      SELECT dbname

      FROM @dblist


  OPEN cur_dblist


  FETCH NEXT FROM cur_dblist

  INTO @cdbname


  WHILE @@FETCH_status = 0

  BEGIN

      SET @sql = ''

      SET @sql = @sql + 'SELECT ''' + @cdbname 

      SET @sql = @sql + ''' AS dbname, isnull(b.groupname, '''

      SET @sql = @sql + 'Transaction Log' + ''') AS groupname, rtrim(a.name) AS filename,'

      SET @sql = @sql + ' rtrim(a.filename) AS filepath, '

      SET @sql = @sql + 'CAST(CAST(a.size AS DEC(15,2))*8/1000. AS DEC(15,2)) AS filesize '

      SET @sql = @sql + 'FROM ' + @cdbname + '.dbo.sysfiles a LEFT OUTER JOIN '

      SET @sql = @sql + @cdbname + '.dbo.sysfilegroups b '

      SET @sql = @sql + 'on a.groupid = b.groupid '

      SET @sql = @sql + 'ORDER BY a.fileid '

  

      INSERT INTO #result_tbl exec(@sql)

  

      FETCH NEXT FROM cur_dblist

      INTO @cdbname

  END

  

  CLOSE cur_dblist

  DEALLOCATE cur_dblist

         

  SELECT dBName, groupname "FileGroup", FileName, FileSize, FilePath

  FROM #result_tbl

  DROP TABLE #result_tbl


  SET NOCOUNT OFF


  RETURN(0) --sp_filegroup0

GO

  

GRANT EXECUTE ON sp_filegroup0 TO PUBLIC

GO



/************************************************************************************************

-- sp_lock0

-- 락 정보를 보여준다.

-- 첫번째 파라미터는 server process id to check for locks

-- 두번째 파라미터는 other process id to check for locks

************************************************************************************************/

USE master

GO


IF OBJECT_ID('sp_lock0') IS NOT NULL

   DROP PROCEDURE sp_lock0

GO


CREATE PROC sp_lock0

@spid1 INT = NULL,

@spid2 INT = NULL 

AS

  SET NOCOUNT ON

  SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED


  DECLARE @objid INT,

     @indid INT,

     @dbid INT,

     @string VARCHAR(255)


  CREATE TABLE #locktable

  ( spid      SMALLINT

  , loginname VARCHAR(20)

  , hostname  VARCHAR(30)

  , dbid      INT

  , dbname    SYSNAME

  , ObjOwner  VARCHAR(128)

  , objId     INT

  , ObjName   VARCHAR(128)

  , IndId     INT

  , IndName   VARCHAR(128)

  , Type      VARCHAR(4)

  , Resource  VARCHAR(16)

  , Mode      VARCHAR(8)

  , Status    VARCHAR(5)

  )


  IF @spid1 IS NOT NULL

  BEGIN

    INSERT #locktable( spid, loginname, hostname, dbid, dbname, ObjOwner, objId, ObjName

                     , IndId, IndName, Type, Resource, Mode, Status

                     )

    SELECT CONVERT (SMALLINT, l.req_spid)

         , COALESCE(SUBSTRING (s.loginame, 1, 20),'')

         , COALESCE(SUBSTRING (s.hostname, 1, 30),'')

         , l.rsc_dbid

         , SUBSTRING (DB_NAME(l.rsc_dbid), 1, 20)

         , ''

         , l.rsc_objid

         , ''

         , l.rsc_indid

         , ''

         , SUBSTRING (v.name, 1, 4)

         , SUBSTRING (l.rsc_text, 1, 16)

         , SUBSTRING (u.name, 1, 8)

         , SUBSTRING (x.name, 1, 5)

    FROM master.dbo.syslockinfo l,

         master.dbo.spt_values v,

         master.dbo.spt_values x,

         master.dbo.spt_values u,

         master.dbo.sysprocesses s

    WHERE l.rsc_type = v.number

      AND v.type = 'LR'

      AND l.req_status = x.number

      AND x.type = 'LS'

      AND l.req_mode + 1 = u.number

      AND u.type = 'L'

      AND req_spid in (@spid1, @spid2)

      AND req_spid = s.spid

  END

  ELSE

  BEGIN

    INSERT #locktable( spid, loginname, hostname, dbid, dbname, ObjOwner, objId, ObjName

                     , IndId, IndName, Type, Resource, Mode, Status

                     )

    SELECT CONVERT (SMALLINT, l.req_spid)

         , COALESCE(SUBSTRING (s.loginame, 1, 20),'')

         , COALESCE(SUBSTRING (s.hostname, 1, 30),'')

         , l.rsc_dbid

         , SUBSTRING (DB_NAME(l.rsc_dbid), 1, 20)

         , ''

         , l.rsc_objid

         , ''

         , l.rsc_indid

         , ''

         , SUBSTRING (v.name, 1, 4)

         , SUBSTRING (l.rsc_text, 1, 16)

         , SUBSTRING (u.name, 1, 8)

         , SUBSTRING (x.name, 1, 5)

    FROM master.dbo.syslockinfo l,

         master.dbo.spt_values v,

         master.dbo.spt_values x,

         master.dbo.spt_values u,

         master.dbo.sysprocesses s

    WHERE l.rsc_type = v.number

      AND v.type = 'LR'

      AND l.req_status = x.number

      AND x.type = 'LS'

      AND l.req_mode + 1 = u.number

      AND u.type = 'L'

      AND req_spid = s.spid

    ORDER BY spID

  END

  

  DECLARE cur_lock2 CURSOR

  FOR SELECT dbid, ObjId, IndId 

      FROM #locktable

      WHERE Type <>'DB' AND Type <> 'FIL'

  

  OPEN cur_lock2

  

  FETCH NEXT FROM cur_lock2 INTO @dbid, @ObjId, @IndId

  

  WHILE @@FETCH_STATUS = 0

  BEGIN

    SELECT @string =

           'USE ' + DB_NAME(@dbid) + CHAR(13)

         + 'update #locktable set ObjName = name, ObjOwner = USER_NAME(uid)'

         + ' FROM sysobjects WHERE id = ' + CONVERT(VARCHAR(32),@objid)

         + ' AND ObjId = ' + CONVERT(VARCHAR(32),@objid)

         + ' AND dbid = ' + CONVERT(VARCHAR(32),@dbId)

  

    EXEC (@string)

  

    SELECT @string =

           'USE ' + DB_NAME(@dbid) + CHAR(13)

         + 'update #locktable set IndName = i.name FROM sysindexes i '

         + ' WHERE i.id = ' + CONVERT(VARCHAR(32),@objid)

         + ' AND i.indid = ' + CONVERT(VARCHAR(32),@indid)

         + ' AND ObjId = ' + CONVERT(VARCHAR(32),@objid)

         + ' AND dbid = ' + CONVERT(VARCHAR(32),@dbId)

         + ' AND #locktable.indid = ' + CONVERT(VARCHAR(32),@indid)

  

    EXEC (@string)

  

    FETCH NEXT FROM cur_lock2 INTO @dbid, @ObjId, @IndId

  END

  

  CLOSE cur_lock2

  DEALLOCATE cur_lock2

  

  SELECT * FROM #locktable

  DROP TABLE #locktable

  

  RETURN(0) --sp_lock0

GO

  

GRANT EXECUTE ON sp_lock0 TO PUBLIC

GO



/************************************************************************************************

-- sp_index0

-- 해당 DB의 인덱스를 모두 보여준다.

************************************************************************************************/

USE master

GO


IF OBJECT_ID('sp_index0') IS NOT NULL

   DROP PROCEDURE sp_index0

GO


CREATE PROC sp_index0

  @objname VARCHAR(100) = NULL

AS

  SET NOCOUNT ON


  IF (@objname IS NULL)

  BEGIN

    SET @objname = 'all_indexes_output'

  END

  ELSE

  BEGIN

    IF NOT EXISTS(SELECT ID

                  FROM sysobjects

                  WHERE id = object_id(@objname)

                    AND xtype IN ('S','U', 'V')

                 )

    BEGIN

       RAISERROR('There is no ''%s'' object(xtype:s,u,v) in this database...', 16, 1,@objname)


       RETURN(1)

    END

  END

  

  CREATE TABLE #indexes_tbl

         ( tblname VARCHAR(255)

         , idxname VARCHAR(255)

         , idxdesc VARCHAR(1000)

         , idxcol VARCHAR(1000)

         )


  DECLARE @ignore_duplicate_keys VARCHAR(35) -- spt_values' name

        , @unique                VARCHAR(35)

        , @ignore_duplicate_rows VARCHAR(35)

        , @hypothetical          VARCHAR(35)

        , @statistics            VARCHAR(35)

        , @primary_key           VARCHAR(35)

        , @unique_key            VARCHAR(35)

        , @auto_create           VARCHAR(35)

        , @stats_no_recompute    VARCHAR(35)


  SELECT @ignore_duplicate_keys = name FROM master.dbo.spt_values 

  WHERE type = 'I' AND number = 1

  SELECT @unique = name FROM master.dbo.spt_values 

  WHERE type = 'I' AND number = 2

  SELECT @ignore_duplicate_rows  = name FROM master.dbo.spt_values 

  WHERE type = 'I' AND number = 4

  SELECT @hypothetical = name FROM master.dbo.spt_values 

  WHERE type = 'I' AND number = 32

  SELECT @statistics = name FROM master.dbo.spt_values 

  WHERE type = 'I' AND number = 64

  SELECT @primary_key = name FROM master.dbo.spt_values 

  WHERE type = 'I' AND number = 2048

  SELECT @unique_key = name FROM master.dbo.spt_values 

  WHERE type = 'I' AND number = 4096

  SELECT @auto_create = name FROM master.dbo.spt_values 

  WHERE type = 'I' AND number = 8388608

  SELECT @stats_no_recompute = name FROM master.dbo.spt_values 

  WHERE type = 'I' AND number = 16777216


  INSERT INTO #indexes_tbl

  SELECT o.name "Table Name"

       , i.name "Index Name"

        --bits 16 off, 1, 2, 16777216 on, located on group

       , CONVERT(VARCHAR(210)

               , CASE WHEN (i.status & 16)<>0 THEN 'clustered' 

                      ELSE 'nonclustered' 

                 END 

               + CASE WHEN (i.status & 1)<>0 THEN ', '+ @ignore_duplicate_keys 

                      ELSE '' 

                 END

               + CASE WHEN (i.status & 2)<>0 THEN ', '+ @unique 

                      ELSE '' 

                 END

               + CASE WHEN (i.status & 4)<>0 THEN ', '+ @ignore_duplicate_rows

                      ELSE '' 

                 END

               + CASE WHEN (i.status & 64)<>0 THEN ', '+ @statistics 

                      ELSE CASE WHEN (i.status & 32)<>0 THEN ', '+ @hypothetical 

                                ELSE '' 

                           END 

                 END

               + CASE WHEN (i.status & 2048)<>0 THEN ', '+ @primary_key 

                      ELSE '' 

                 END

               + CASE WHEN (i.status & 4096)<>0 THEN ', '+ @unique_key 

                      ELSE '' 

                 END

               + CASE WHEN (i.status & 8388608)<>0 THEN ', '+ @auto_create 

                      ELSE '' 

                 END

               + CASE WHEN (i.status & 16777216)<>0 THEN ', '+ @stats_no_recompute  

                      ELSE '' 

                 END

                ) "Index Description"

       , LEFT(ISNULL(INDEX_COL(o.name,indid, 1)+', ','') 

              + ISNULL(INDEX_COL(o.name,indid, 2)+ ', ','')

              + ISNULL(INDEX_COL(o.name,indid, 3)+', ','') 

              + ISNULL(INDEX_COL(o.name,indid, 4)+ ', ','')

              + ISNULL(INDEX_COL(o.name,indid, 5)+', ','')

              + ISNULL(INDEX_COL(o.name,indid, 6)+ ', ','')

              + ISNULL(INDEX_COL(o.name,indid, 7)+', ','')

              + ISNULL(INDEX_COL(o.name,indid, 8)+ ', ','')

             ,len(ISNULL(INDEX_COL(o.name,indid, 1)+', ','')

                  + ISNULL(INDEX_COL(o.name,indid, 2)+ ', ','')

                  + ISNULL(INDEX_COL(o.name,indid, 3)+', ','')

                  + ISNULL(INDEX_COL(o.name,indid, 4)+ ', ','')

                  + ISNULL(INDEX_COL(o.name,indid, 5)+', ','')

                  + ISNULL(INDEX_COL(o.name,indid, 6)+ ', ','')

                  + ISNULL(INDEX_COL(o.name,indid, 7)+', ','')

                  + ISNULL(INDEX_COL(o.name,indid, 8)+ ', ','')

                  ) - 1

             ) "Indexed Column Name"

  FROM sysindexes i INNER JOIN sysobjects o

                    ON i.id = o.id

  WHERE i.indid > 0 

    AND i.indid < 255

    AND o.type = 'U'

    --exclude autostatistic index

    AND (i.status & 64) = 0

    AND (i.status & 8388608) = 0

    AND (i.status & 16777216)= 0

  ORDER BY o.name

  

  IF (@objname = 'all_indexes_output')

    SELECT *

    FROM #indexes_tbl

  ELSE

    SELECT *

    FROM #indexes_tbl

    WHERE tblname = @objname


  DROP TABLE #indexes_tbl


  RETURN(0) --sp_index0

  

  SET NOCOUNT OFF

GO 


GRANT EXECUTE ON sp_index0 TO PUBLIC

GO



/************************************************************************************************

-- sp_filepageno0

-- BINARY의 first값에서 파일번호와 페이지번호를 DECIMAL로 출력한다.

************************************************************************************************/

USE MASTER

GO


IF OBJECT_ID('sp_filepageno0') IS NOT NULL

   DROP PROCEDURE sp_filepageno0

GO


CREATE PROC sp_filepageno0 

  @first BINARY(6) = NULL

AS

  SET NOCOUNT ON


  DECLARE @msg VARCHAR(100)

  DECLARE @file_id INT

  DECLARE @page_id INT


  IF (@first IS NULL)

  BEGIN  

    SET @msg = '''@first'' parameter is null. You can get @first from Sysindexes Table...'

    RAISERROR(@msg, 16, 1, @first)      

  

    RETURN(1)  

  END  


  SET @file_id = convert(varchar(5), (convert(int, substring(@first, 6, 1)) * power(2, 8)) 

                                   + (convert(int, substring(@first, 5, 1))) 

                )


  SET @page_id = convert(varchar(11), (convert(int, substring(@first, 4, 1)) * power(2, 24)) 

                                    + (convert(int, substring(@first, 3, 1)) * power(2, 16)) 

                                    + (convert(int, substring(@first, 2, 1)) * power(2, 8)) 

                                    + (convert(int, substring(@first, 1, 1))) 

)

  

  SELECT @file_id "FILE_ID", @page_id "PAGE_ID"


  RETURN(0) --sp_filepageno0


  SET NOCOUNT OFF


GO

  

GRANT EXECUTE ON sp_filepageno0 TO PUBLIC

GO



/************************************************************************************************

-- sp_constraint0

-- 해당 DB 전체의 제약사항이나 특정 오브젝트의 제약사항을 출력한다.

************************************************************************************************/

USE MASTER

GO


IF OBJECT_ID('sp_constraint0') IS NOT NULL

   DROP PROCEDURE sp_constraint0

GO


CREATE PROC sp_constraint0 

  @objname VARCHAR(100) = NULL

AS

  SET NOCOUNT ON


  DECLARE @dbname SYSNAME

  DECLARE @sql VARCHAR(1000)

  

  SET @dbname = db_name()

  SET @sql = ''


  IF (@objname IS NULL)

  BEGIN

    SET @sql = 'SELECT object_name(id) "OBEJCT_NAME", object_name(constid) "CONST_NAME" '

    SET @sql = @sql + 'FROM ' + @dbname + '..sysconstraints '

    SET @sql = @sql + 'ORDER BY object_name(id)'


    EXEC (@sql)

  END

  ELSE

  BEGIN

    IF NOT EXISTS(SELECT ID

                  FROM sysobjects

                  WHERE id = object_id(@objname)

                    AND xtype IN ('S','U', 'V')

                 )

    BEGIN

       RAISERROR('There is no ''%s'' object(xtype:s,u,v) in this database...', 16, 1,@objname)


       RETURN(1)

    END


    SET @sql = 'SELECT object_name(id) "OBEJCT_NAME", object_name(constid) "CONST_NAME" '

    SET @sql = @sql + 'FROM ' + @dbname + '..sysconstraints WHERE id = '

    SET @sql = @sql + CAST(object_id(@objname) as VARCHAR(10))

    SET @sql = @sql + 'ORDER BY object_name(id)'

    

    EXEC (@sql)

  END


  RETURN(0) --sp_constraint0


  SET NOCOUNT OFF


GO

  

GRANT EXECUTE ON sp_constraint0 TO PUBLIC

GO



/************************************************************************************************

-- sp_trigger0

-- 해당 DB의 모든 트리거나 특정 오브젝트의 트리거를 출력한다.

************************************************************************************************/

USE MASTER

GO


IF OBJECT_ID('sp_trigger0') IS NOT NULL

   DROP PROCEDURE sp_trigger0

GO


CREATE PROC sp_trigger0 

  @objname VARCHAR(100) = NULL

AS

  SET NOCOUNT ON


  IF (@objname IS NULL)

    SELECT name "TRG_NAME"

         , user_name(uid) "TRG_OWNER"

         , ObjectProperty( id, 'ExecIsUpdateTrigger') "IS_UPDATE"

         , ObjectProperty( id, 'ExecIsDeleteTrigger') "IS_DELETE"

         , ObjectProperty( id, 'ExecIsInsertTrigger') "IS_INSERT"

         , ObjectProperty( id, 'ExecIsAfterTrigger') "AFTER_TRG"

         , ObjectProperty( id, 'ExecIsInsteadOfTrigger') "INSEAD_OF_TRG"

    FROM sysobjects

    WHERE type = 'TR' 

  ELSE

  BEGIN

    IF NOT EXISTS(SELECT ID

                  FROM sysobjects

                  WHERE id = object_id(@objname)

                    AND xtype IN ('S','U', 'V')

                 )

    BEGIN

      RAISERROR('There is no ''%s'' object(xtype:s,u,v) in this database...', 16, 1,@objname)


      RETURN(1)

    END


    SELECT name "TRG_NAME"

         , user_name(uid) "TRG_OWNER"

         , ObjectProperty( id, 'ExecIsUpdateTrigger') "IS_UPDATE"

         , ObjectProperty( id, 'ExecIsDeleteTrigger') "IS_DELETE"

         , ObjectProperty( id, 'ExecIsInsertTrigger') "IS_INSERT"

         , ObjectProperty( id, 'ExecIsAfterTrigger') "AFTER_TRG"

         , ObjectProperty( id, 'ExecIsInsteadOfTrigger') "INSTEADOF_TRG"

    FROM sysobjects

    WHERE parent_obj = object_id(@objname)

      AND type = 'TR'

  END


  RETURN(0) --sp_trigger0


  SET NOCOUNT OFF


GO

  

GRANT EXECUTE ON sp_trigger0 TO PUBLIC

GO



/************************************************************************************************

-- sp_converthex0

-- 해당 오브젝트의 인덱스 관련 파일과 페이지번호를 전체 출력한다.

************************************************************************************************/

USE MASTER

GO


IF OBJECT_ID('sp_converthex0') IS NOT NULL

   DROP PROCEDURE sp_converthex0

GO


CREATE PROC sp_converthex0 

  @objname VARCHAR(100) = NULL

AS

  SET NOCOUNT ON


  IF (@objname IS NULL)

  BEGIN

       RAISERROR('''@objname'' parameter is empty... ', 16, 1)


       RETURN(1)

  END


  IF NOT EXISTS(SELECT ID

                FROM sysobjects

                WHERE id = object_id(@objname)

                  AND xtype IN ('S','U', 'V')

               )

  BEGIN

     RAISERROR('There is no ''%s'' object(xtype:s,u,v) in this database...', 16, 1,@objname)


     RETURN(1)

  END


  SELECT convert(char(30), name) AS 'object_name', 

id, 

indid, 

convert(varchar(2), (convert(int, substring(first, 6, 1)) * power(2, 8)) 

                    + (convert(int, substring(first, 5, 1)))) + ':' +

convert(varchar(11), 

(convert(int, substring(first, 4, 1)) * power(2, 24)) + 

(convert(int, substring(first, 3, 1)) * power(2, 16)) + 

(convert(int, substring(first, 2, 1)) * power(2, 8)) + 

(convert(int, substring(first, 1, 1)))) AS "firstDec",

first,

convert(varchar(2), (convert(int, substring(root, 6, 1)) * power(2, 8)) 

                    + (convert(int, substring(root, 5, 1)))) + ':' +

convert(varchar(11), 

(convert(int, substring(root, 4, 1)) * power(2, 24)) + 

(convert(int, substring(root, 3, 1)) * power(2, 16)) + 

(convert(int, substring(root, 2, 1)) * power(2, 8)) + 

(convert(int, substring(root, 1, 1)))) AS "rootDec",

root,

convert(varchar(2), (convert(int, substring(firstIAM, 6, 1)) * power(2, 8)) 

                    + (convert(int, substring(firstIAM, 5, 1)))) + ':' +

convert(varchar(11), 

(convert(int, substring(firstIAM, 4, 1)) * power(2, 24)) + 

(convert(int, substring(firstIAM, 3, 1)) * power(2, 16)) + 

(convert(int, substring(firstIAM, 2, 1)) * power(2, 8)) + 

(convert(int, substring(firstIAM, 1, 1)))) AS "firstIAMDec",

firstIAM

  FROM sysindexes

  WHERE id = object_id(@objname)


  RETURN(0) --sp_converthex0


  SET NOCOUNT OFF

GO

  

GRANT EXECUTE ON sp_converthex0 TO PUBLIC

GO



/************************************************************************************************

-- sp_spaceused0

-- 서버의 전체 DB에 대한 사이즈를 출력한다.

************************************************************************************************/

USE MASTER

GO


IF OBJECT_ID('sp_spaceused0') IS NOT NULL

   DROP PROCEDURE sp_spaceused0

GO


CREATE PROC sp_spaceused0

AS

  SET NOCOUNT ON


  DECLARE @dbname SYSNAME

  DECLARE @sql VARCHAR(1000)

  DECLARE @pages INT  

  DECLARE @dbsize DEC(15,0)  

  DECLARE @logsize DEC(15)  


  DECLARE @str VARCHAR(2000)


  CREATE TABLE #spt_space  

  ( dbname SYSNAME NOT NULL

  , pages INT NULL

  , dbsize DEC(15,0) NULL

  , logsize DEC(15,0) NULL

  , bytesperpage DEC(15,0) NULL

  , pagesperMB  DEC(15,0) NULL

  , reserved DEC(15) NULL 

  , data DEC(15) NULL

  , indexp DEC(15) NULL

  , unused DEC(15) NULL 

  )  


  INSERT INTO #spt_space(dbname)

  SELECT name

  FROM master.dbo.sysdatabases

  WHERE name not in ('master','msdb','model','tempdb','pubs','northwind')

  


  DECLARE cur_db_size CURSOR READ_ONLY

  FOR 

    SELECT dbname

    FROM #spt_space


  OPEN cur_db_size


  FETCH NEXT FROM cur_db_size

  INTO @dbname


  WHILE @@FETCH_status = 0

  BEGIN

  

    SET @str = ''

    SET @str = @str + 'UPDATE #spt_space '

    SET @str = @str + 'SET dbsize = (SELECT SUM(CONVERT(DEC(15),size)) '

    SET @str = @str + '              FROM ' + @dbname + '.dbo.sysfiles '

    SET @str = @str + '              WHERE (status & 64 = 0) '

    SET @str = @str + '             ) '

    SET @str = @str + 'WHERE dbname = ''' + @dbname + ''''

  

    EXEC(@str)


    SET @str = ''

    SET @str = @str + 'UPDATE #spt_space '

    SET @str = @str + 'SET logsize = (SELECT SUM(CONVERT(DEC(15),size)) '

    SET @str = @str + '               FROM ' + @dbname + '.dbo.sysfiles '

    SET @str = @str + '               WHERE (status & 64 <> 0) '

    SET @str = @str + '              ) '

    SET @str = @str + 'WHERE dbname = ''' + @dbname + ''''


    EXEC(@str)


    SET @str = ''

    SET @str = @str + 'UPDATE #spt_space '

    SET @str = @str + 'SET bytesperpage = (SELECT low '

    SET @str = @str + '                    FROM master.dbo.spt_values '

    SET @str = @str + '                    WHERE number = 1 AND type = ''E'' '  

    SET @str = @str + '                   ) '

    SET @str = @str + 'WHERE dbname = ''' + @dbname + ''''

 

    EXEC(@str)


    SET @str = ''

    SET @str = @str + 'UPDATE #spt_space '

    SET @str = @str + 'SET pagesperMB = 1048576 / (SELECT bytesperpage '

    SET @str = @str + '                            FROM #spt_space '

    SET @str = @str + '                            WHERE dbname = ''' + @dbname + ''''

    SET @str = @str + '                           ) ' 

    SET @str = @str + 'WHERE dbname = ''' + @dbname + ''''


    EXEC(@str)


    SET @str = ''

    SET @str = @str + 'UPDATE #spt_space '

    SET @str = @str + 'SET reserved = (SELECT SUM(CONVERT(DEC(15),reserved)) '

    SET @str = @str + '                FROM ' + @dbname + '.dbo.sysindexes '

    SET @str = @str + '                WHERE indid in (0, 1, 255) '

    SET @str = @str + '               ) '

    SET @str = @str + 'WHERE dbname = ''' + @dbname + ''''


    EXEC(@str)


    -- data: sum(dpages) where indid < 2 + sum(used) where indid = 255 (text)  

    SET @str = ''

    SET @str = @str + 'UPDATE #spt_space '

    SET @str = @str + 'SET pages = (SELECT SUM(CONVERT(DEC(15),dpages)) '

    SET @str = @str + '             FROM ' + @dbname + '.dbo.sysindexes '

    SET @str = @str + '             WHERE indid < 2 '

    SET @str = @str + '            ) '

    SET @str = @str + 'WHERE dbname = ''' + @dbname + ''''


    EXEC(@str)


    SET @str = ''

    SET @str = @str + 'UPDATE #spt_space '

    SET @str = @str + 'SET pages = pages + (SELECT + ISNULL(SUM(CONVERT(DEC(15),used)), 0) ' 

    SET @str = @str + '                     FROM ' + @dbname + '.dbo.sysindexes '

    SET @str = @str + '                     WHERE indid = 255 '

    SET @str = @str + '                    ) '

    SET @str = @str + 'WHERE dbname = ''' + @dbname + ''''


    EXEC(@str)


    SET @str = ''

    SET @str = @str + 'UPDATE #spt_space '

    SET @str = @str + 'SET data = (SELECT pages '

    SET @str = @str + '            FROM #spt_space '

    SET @str = @str + '            WHERE dbname = ''' + @dbname + ''''

    SET @str = @str + '           ) '

    SET @str = @str + 'WHERE dbname = ''' + @dbname + ''''


    EXEC(@str)


    -- index: sum(used) where indid in (0, 1, 255) - @data 

    SET @str = ''

    SET @str = @str + 'UPDATE #spt_space '

    SET @str = @str + 'SET indexp = (SELECT SUM(CONVERT(DEC(15),used)) '

    SET @str = @str + '              FROM ' + @dbname + '.dbo.sysindexes '

    SET @str = @str + '              WHERE indid IN (0, 1, 255) '

    SET @str = @str + '             ) - data '

    SET @str = @str + 'WHERE dbname = ''' + @dbname + ''''


    EXEC(@str) 


    -- unused: sum(reserved) - sum(used) where indid in (0, 1, 255) 

    SET @str = ''

    SET @str = @str + 'UPDATE #spt_space '

    SET @str = @str + 'SET unused = reserved - (SELECT SUM(CONVERT(DEC(15),used)) ' 

    SET @str = @str + '                         FROM ' + @dbname + '.dbo.sysindexes '

    SET @str = @str + '                         WHERE indid IN (0, 1, 255)) '

    SET @str = @str + 'WHERE dbname = ''' + @dbname + ''''


    EXEC(@str)



    FETCH NEXT FROM cur_db_size

    INTO @dbname

  END


  CLOSE cur_db_size

  DEALLOCATE cur_db_size


  SELECT

      dbname AS "dBName"   

  ,   CONVERT(DEC(10,2),(dbsize + logsize) / pagesperMB) AS "DiskSize(MB)"

  ,   CONVERT(DEC(10,2),(reserved * bytesperpage / 1024) / 1000) AS "ReservedSize(MB)"

  ,   CONVERT(DEC(10,2),(data * bytesperpage / 1024) / 1000) AS "DataSize(MB)"

  ,   CONVERT(DEC(10,2),(indexp * bytesperpage / 1024) / 1000) AS "IndexSize(MB)"

  ,   CONVERT(DEC(10,2),(unused * bytesperpage / 1024) / 1000) AS "UnusedSize(MB)"

  FROM #spt_space


  DROP TABLE #spt_space;


  RETURN(0) --sp_spaceused0


  SET NOCOUNT OFF


GO

  

GRANT EXECUTE ON sp_spaceused0 TO PUBLIC

GO



/************************************************************************************************

-- sp_rowlength0

-- 해당 DB의 Table, View의 Row길이를 출력한다.

************************************************************************************************/

USE master

GO


IF OBJECT_ID('sp_rowlength0') IS NOT NULL

   DROP PROCEDURE sp_rowlength0

GO


CREATE PROC sp_rowlength0    

AS

  SET NOCOUNT ON


  SELECT object_name(b.id) "Obj_Name", a.xtype, SUM(b.length) "Length"

  FROM sysobjects a INNER JOIN syscolumns b

                    ON a.id = b.id

  WHERE a.xtype IN ('u','v','S')

  AND object_name(b.id) NOT LIKE 'dt_%'

  GROUP BY object_name(b.id), a.xtype

  ORDER BY CASE A.XTYPE WHEN 'U' THEN 1

                        WHEN 'V' THEN 2

                        WHEN 'S' THEN 3

           END


  SET NOCOUNT OFF


  RETURN(0) --sp_rowlength0


GO


GRANT EXECUTE ON sp_rowlength0 TO PUBLIC

GO



/************************************************************************************************

-- sp_freedisksize0

-- 물리적 드라이브 가용량을 표시한다.

************************************************************************************************/

USE MASTER

GO


IF OBJECT_ID('sp_freedisksize0') IS NOT NULL

   DROP PROCEDURE sp_freedisksize0

GO


CREATE PROC sp_freedisksize0    

AS

  SET NOCOUNT ON


  DECLARE @hr INT

  DECLARE @fso INT

  DECLARE @drive CHAR(1)

  DECLARE @odrive INT

  DECLARE @TotalSize VARCHAR(20)

  DECLARE @free INT

  DECLARE @query VARCHAR(1300)

  DECLARE @MB BIGINT 


  SET @MB = 1048576

  SET @query= 'master.dbo.xp_fixeddrives'


  CREATE TABLE #drives 

  ( drive CHAR(1) PRIMARY KEY

  , FreeSize INT NULL

  , TotalSize INT NULL

  )


  INSERT #drives(drive,FreeSize) EXEC @query


  EXEC @hr=sp_OACreate 'Scripting.FileSystemObject',@fso OUT


  IF @hr <> 0 EXEC sp_OAGetErrorInfo @fso


  DECLARE cur_freespace CURSOR FAST_FORWARD

  FOR SELECT drive 

      FROM #drives

      ORDER by drive


  OPEN cur_freespace


  FETCH NEXT FROM cur_freespace INTO @drive


  WHILE @@FETCH_STATUS=0

  BEGIN

    EXEC @hr = sp_OAMethod @fso,'GetDrive', @odrive OUT, @drive


    IF @hr <> 0 

    EXEC sp_OAGetErrorInfo @fso

 

    EXEC @hr = sp_OAGetProperty @odrive,'TotalSize', @TotalSize OUT


    IF @hr <> 0 

    EXEC sp_OAGetErrorInfo @odrive


    UPDATE #drives

    SET TotalSize=@TotalSize/@MB

    WHERE drive=@drive


    FETCH NEXT FROM cur_freespace INTO @drive

  END


  CLOSE cur_freespace


  DEALLOCATE cur_freespace


  EXEC @hr=sp_OADestroy @fso


  IF @hr <> 0 EXEC sp_OAGetErrorInfo @fso


  SELECT drive "Drive"

       , totalsize "TotalSize(MB)"

       , freesize "FreeSize(MB)"

       , CAST(CAST(freesize as DEC(10,2)) / CAST(totalsize AS DEC(10,2)) 

              * 100 AS DEC(10,2)) "FreeSize(%)"

  FROM #drives


  DROP TABLE #drives


  RETURN(0) --sp_freedisksize0


  SET NOCOUNT OFF


GO

  

GRANT EXECUTE ON sp_freedisksize0 TO PUBLIC

GO



/************************************************************************************************

-- sp_object0

-- 파라미터 없이 모든 오브젝트를 표시하고 특정 파라미터 기입시 상세 설명이 출력된다.

-- 'help' 파라미터시 파라미터 help manual이 출력된다.

************************************************************************************************/

USE MASTER

GO


IF OBJECT_ID('sp_object0') IS NOT NULL

   DROP PROCEDURE sp_object0

GO


CREATE PROC sp_object0 

  @param VARCHAR(100) = NULL

AS

  SET NOCOUNT ON


  DECLARE @str VARCHAR(2000)

        , @fk_name SYSNAME

        , @fk_table SYSNAME

        , @rk_table SYSNAME

        , @fkey VARCHAR(100)

        , @rkey VARCHAR(100)

        , @fkeys VARCHAR(100)

        , @rkeys VARCHAR(100)


  SET @fkey = ''

  SET @rkey = ''

  SET @fkeys = ''

  SET @rkeys = ''


  CREATE TABLE #temp_tbl  

  ( tblname VARCHAR(255)  

  , idxname VARCHAR(255)  

  , idxdesc VARCHAR(1000)  

  , idxcol VARCHAR(1000)  

  ) 


  CREATE TABLE #fk_tbl

  ( fk_name SYSNAME

  , foreign_table VARCHAR(100)

  , foreign_column VARCHAR(100)

  , delete_action VARCHAR(10)

  , update_action VARCHAR(10)

  , reference_table VARCHAR(100)

  , reference_column VARCHAR(100)

  )


  IF (@param IS NOT NULL) AND 

     (@param NOT IN ('S','U','V','PK','UQ','FK','SP','SF','IF'

                    ,'TF','TR','XP','L', 'help','CK','DF'))

  BEGIN

     RAISERROR('''%s'' is not a designated parameter. 

               Please use ''help'' parameter.', 16, 1,@param)

    RETURN(1)

  END


  IF (@param IS NULL)

  BEGIN

    SELECT "ObjectType" = 

      CASE xtype WHEN 'F'  THEN 'FOREIGN KEY'

                 WHEN 'L'  THEN 'LOG'

                 WHEN 'FN' THEN 'SCHOLAR FUNCTION'

                 WHEN 'IF' THEN 'INLINE TABLE FUNCTION'

                 WHEN 'P'  THEN 'USER PROCEDURE'

                 WHEN 'PK' THEN 'PRIMARY KEY'

                 WHEN 'S'  THEN 'SYSTEM TABLE'

                 WHEN 'TF' THEN 'TABLE FUNTION'

                 WHEN 'TR' THEN 'TRIGGER'

                 WHEN 'U'  THEN 'USER TABLE'

                 WHEN 'UQ' THEN 'UNIQUE'

                 WHEN 'D'  THEN 'Default'

                 WHEN 'C'  THEN 'Cehck'

                 WHEN 'V'  THEN 'VIEW'

                 WHEN 'X'  THEN 'EXTENDED PROCEDURE'

      END

    , OBJECT_NAME(parent_obj) "ParentObject"

    , name "ObjectName"

    FROM sysobjects

    WHERE xtype != 'S'

    ORDER BY CASE xtype WHEN 'S'  THEN 1

                        WHEN 'U'  THEN 2

                        WHEN 'V'  THEN 3

                        WHEN 'PK' THEN 4

                        WHEN 'UQ' THEN 5

                        WHEN 'D'  THEN 6

                        WHEN 'C'  THEN 7

                        WHEN 'F'  THEN 8

                        WHEN 'P'  THEN 9

                        WHEN 'FN' THEN 10

                        WHEN 'IF' THEN 11

                        WHEN 'TF' THEN 12

                        WHEN 'TR' THEN 13

                        WHEN 'X'  THEN 14

                        WHEN 'L'  THEN 15

                        ELSE 16

             END


    RETURN(0)

  END


  IF (@param = 'help')

  BEGIN

    PRINT ' SUBJECT'

    PRINT '     This procedure is for viewing all objects in selected database. '

    PRINT ' '

    PRINT ' DESCRIPTION'

    PRINT '     EXEC sp_object0'

    PRINT '         View all objects in selected database.'

    PRINT ' '

    PRINT '     EXEC sp_object0 ''help'''

    PRINT '         View help manual with usage, parameter.'

    PRINT ' '

    PRINT '     EXEC sp_object0 ''<parameter>'''

    PRINT '         View specified object by a parameter.'

    PRINT ' ' 

    PRINT ' PARAMETER'

    PRINT '     S  : System Table'

    PRINT '     U  : User Table'

    PRINT '     V  : View'

    PRINT '     PK : Primary Key'

    PRINT '     UQ : Unique'

    PRINT '     FK : Foreign Key'

    PRINT '     SP : Stored Procedure'

    PRINT '     XP : Extened Procedure'

    PRINT '     SF : Scholar Function'

    PRINT '     IF : Inline Table Function'

    PRINT '     TF : Table Function'

    PRINT '     TR : Trigger'

    PRINT '     CK : Check'

    PRINT '     DF : Default'

    PRINT '     L  : Log'

    PRINT ' '

    PRINT ' END'

 

    RETURN(0)

  END


  IF (@param in ('S','U','V'))

  BEGIN

    SELECT name "ObjectName"

    FROM sysobjects

    WHERE xtype = @param

    AND status >= CASE WHEN @param ='S' THEN -2147483648

                       WHEN @param IN ('U','V') THEN 0

                  END

    RETURN(0)

  END

 

  IF (@param in ('PK', 'UQ'))

  BEGIN

    INSERT INTO #temp_tbl EXEC('sp_index0')


    SELECT OBJECT_NAME(s.parent_obj) "TableName", s.name "Name", t.idxcol "ColumnName"

    FROM sysobjects s INNER JOIN #temp_tbl t

                      ON OBJECT_NAME(s.parent_obj) = t.tblname

    WHERE s.xtype = @param

    AND t.idxdesc LIKE CASE @param WHEN 'PK' THEN '%primary key%'

                                   WHEN 'UQ' THEN '%unique key%'

                       END


    RETURN(0)

  END


  IF (@param in ('FK'))

  BEGIN

    INSERT INTO #fk_tbl(fk_name, foreign_table, reference_table, delete_action, update_action)

    SELECT o.name, object_name(o.parent_obj), object_name(r.rkeyid)

         , CASE ObjectProperty(r.constid, 'CnstIsDeleteCascade') WHEN 1 THEN 'Cascade'

                                                                 WHEN 0 THEN 'No Action'

           END  

         , CASE ObjectProperty(r.constid, 'CnstIsUpdateCascade') WHEN 1 THEN 'Cascase'

                                                                 WHEN 0 THEN 'No Action'

           END

    FROM sysobjects o INNER JOIN sysreferences r

                      ON o.id = r.constid

    WHERE xtype = 'F'

    

    DECLARE cur_fk_col CURSOR 

    FOR SELECT fk_name, foreign_table, reference_table

        FROM #fk_tbl


    OPEN cur_fk_col


    FETCH NEXT FROM cur_fk_col

    INTO @fk_name, @fk_table, @rk_table


    WHILE (@@fetch_status = 0)

    BEGIN

         SET @rkeys = ''

         SET @fkeys = ''


         DECLARE cur_fk_col2 CURSOR 

         FOR SELECT rkey, fkey

         FROM sysforeignkeys

         WHERE constid = object_id(@fk_name)


         OPEN cur_fk_col2   


         FETCH NEXT FROM cur_fk_col2

         INTO @rkey, @fkey  


         WHILE (@@fetch_status = 0)

         BEGIN

              SET @rkeys = @rkeys + col_name(object_id(@rk_table),@rkey) + ', '

              SET @fkeys = @fkeys + col_name(object_id(@fk_table),@fkey) + ', '


              FETCH NEXT FROM cur_fk_col2

              INTO @rkey, @fkey 

         END


         CLOSE cur_fk_col2

 

         DEALLOCATE cur_fk_col2


         UPDATE #fk_tbl

         SET foreign_column = '(' + SUBSTRING(@fkeys,1, LEN(@fkeys)-1) + ')'

           , reference_column = '(' + SUBSTRING(@rkeys,1, LEN(@rkeys)-1) + ')'

         WHERE CURRENT OF cur_fk_col


         FETCH NEXT FROM cur_fk_col

         INTO @fk_name, @fk_table, @rk_table

    END


    CLOSE cur_fk_col

 

    DEALLOCATE cur_fk_col



    SELECT * FROM #fk_tbl


    RETURN(0)

  END


  IF (@param in ('SP','SF','IF','TF','XP'))

  BEGIN

    SELECT name "ObjectName"

    FROM sysobjects

    WHERE xtype = CASE @param WHEN 'SP' THEN 'P'

                              WHEN 'SF' THEN 'FN'

                              WHEN 'XP' THEN 'X'

                              ELSE @param

                  END

    AND status >= CASE WHEN @param ='XP' THEN -2147483648

                       WHEN @param IN ('SP','SF','IF','TF') THEN 0

                  END

    RETURN(0)

  END


  IF (@param in ('L'))

  BEGIN

    PRINT 'There is no finish scripting with Log...'    


    RETURN(0)

  END


  IF (@param = 'TR')

  BEGIN

    SELECT name "TRG_NAME"  

         , user_name(uid) "TRG_OWNER"  

         , ObjectProperty( id, 'ExecIsUpdateTrigger') "IS_UPDATE"  

         , ObjectProperty( id, 'ExecIsDeleteTrigger') "IS_DELETE"  

         , ObjectProperty( id, 'ExecIsInsertTrigger') "IS_INSERT"  

         , ObjectProperty( id, 'ExecIsAfterTrigger') "AFTER_TRG"  

         , ObjectProperty( id, 'ExecIsInsteadOfTrigger') "INSEAD_OF_TRG"  

    FROM sysobjects  

    WHERE type = @param


    RETURN(0)

  END


  IF (@param in ('DF','CK'))

  BEGIN

     SELECT so.name "Name"

          , OBJECT_NAME(so.parent_obj) "TableName"

          , cl.name "ColumnName"

          , cm.text "Contents"

     FROM sysobjects so INNER JOIN sysconstraints cs

                        ON so.id = cs.constid

                        INNER JOIN syscomments cm

                        ON so.id = cm.id

                        INNER JOIN syscolumns cl

                        ON so.parent_obj = cl.id

                        AND cs.colid = cl.colid

     WHERE so.xtype = CASE @param WHEN 'DF' THEN 'D'

                                  WHEN 'CK' THEN 'C'

                      END

     AND cm.colid = 1 


    RETURN(0)

  END


  DROP TABLE #temp_tbl

  DROP TABLE #fk_tbl


  RETURN(0) -- sp_object0 


  SET NOCOUNT OFF

GO



EXEC sp_MS_marksystemobject 'sp_object0'

GO

  

GRANT EXECUTE ON sp_object0 TO PUBLIC

GO



/************************************************************************************************

-- sp_showcontig0

-- 인덱스 조각화 정보를 전체와 기준값을 기준으로 보여준다.

-- 처음 파라미터는 조각화 수치 기준으로 필터링.

-- 두번째 파라미터는 해당 테이블만 적용.

************************************************************************************************/


USE MASTER

GO


IF OBJECT_ID('sp_showcontig0') IS NOT NULL

   DROP PROCEDURE sp_showcontig0

GO


CREATE PROC sp_showcontig0  

  @value decimal(3) = 0

, @objname varchar(4) = NULL

AS

  SET NOCOUNT ON


  IF (@objname IS NOT NULL)

  BEGIN

    IF NOT EXISTS(SELECT ID

                  FROM sysobjects

                  WHERE id = object_id(@objname)

                    AND xtype IN ('S','U', 'V')

                 )

    BEGIN

       RAISERROR('There is no ''%s'' object(xtype:s,u,v) in this database...', 16, 1,@objname)


       RETURN(1)

    END

  END


  DECLARE @dbname SYSNAME

  DECLARE @sql VARCHAR(300)

  DECLARE @tblname SYSNAME

  DECLARE @idxname SYSNAME


  CREATE TABLE #tableindex

  ( tblname SYSNAME

  , idxname SYSNAME

  , idxdesc VARCHAR(1000)

  , idxcol VARCHAR(1000)

  )


  CREATE TABLE #fraglist

  ( ObjectName SYSNAME

  , ObjectId INT

  , IndexName SYSNAME

  , IndexId INT

  , Lvl INT

  , CountPages INT

  , CountRows INT

  , MinRecSize INT

  , MaxRecSize INT

  , AvgRecSize INT

  , ForRecCount INT

  , Extents INT

  , ExtentSwitches INT

  , AvgFreeBytes INT

  , AvgPageDensity INT

  , ScanDensity DECIMAL

  , BestCount INT

  , ActualCount INT

  , LogicalFrag DECIMAL

  , ExtentFrag DECIMAL

  )


  SET @dbname = db_name()

  SET @sql = 'INSERT INTO #tableindex EXEC ' + @dbname + '..sp_index0'

  

  EXEC (@sql)


  IF (@objname IS NULL)

     DELETE FROM #tableindex WHERE tblname = 'dtproperties'

  ELSE

     DELETE FROM #tableindex WHERE tblname != @objname


  DECLARE cur_contig CURSOR READ_ONLY

  FOR SELECT tblname, idxname

      FROM #tableindex


  OPEN cur_contig


  FETCH NEXT FROM cur_contig

  INTO @tblname, @idxname


  WHILE @@FETCH_STATUS = 0

  BEGIN

      SET @sql = 'USE ' + @dbname

      SET @sql = @sql +' DBCC SHOWCONTIG (''' + @tblname + ''','''

      SET @sql = @sql + @idxname + ''') WITH TABLERESULTS'

    

      INSERT INTO #fraglist 

      EXEC (@sql)

   

      FETCH NEXT FROM cur_contig

      INTO @tblname, @idxname

  END


  CLOSE cur_contig

  DEALLOCATE cur_contig

  

  IF (@value = 0)

     SELECT objectname "TblName"

          , indexname "IdxName"

          , countpages "ScanPage"

          , extents "ScanExtent"

          , extentswitches "SwitchExtent"

          , CASE WHEN extents = 0 THEN 0

                 ELSE CAST(CAST(countpages AS DEC) 

                           / CAST(extents AS DEC) 

                          AS DEC(4,1)) 

            END "Avg.Page/Extent"

          , CAST(scandensity AS VARCHAR(6)) + '% ['

            + CAST(bestcount AS VARCHAR(10)) + ':'

            + CAST(actualcount AS VARCHAR(10)) + ']'

            "ScanDensity[Best:Actual]"

          , CAST(logicalfrag AS Varchar(3)) + '%' "LogicalScanFrag"

          , CAST(extentfrag AS vARCHAR(3)) + '%' "ExtentScanFrag"

          , avgfreebytes "Avg.FreeBytes/Page"

          , CAST(avgpagedensity AS VARCHAR(3)) + '%' "Avg.PageDensity(Full)"

          , ForRecCount "ForwardedRec."

     FROM #fraglist

  ELSE

     SELECT objectname "TblName"

          , indexname "IdxName"

          , countpages "ScanPage"

          , extents "ScanExtent"

          , extentswitches "SwitchExtent"

          , CASE WHEN extents = 0 THEN 0

                 ELSE CAST(CAST(countpages AS DEC) 

                           / CAST(extents AS DEC) 

                          AS DEC(4,1)) 

            END "Avg.Page/Extent"

          , CAST(scandensity AS VARCHAR(6)) + '% ['

            + CAST(bestcount AS VARCHAR(10)) + ':'

            + CAST(actualcount AS VARCHAR(10)) + ']'

            "ScanDensity[Best:Actual]"

          , CAST(logicalfrag AS Varchar(3)) + '%' "LogicalScanFrag"

          , CAST(extentfrag AS vARCHAR(3)) + '%' "ExtentScanFrag"

          , avgfreebytes "Avg.FreeBytes/Page"

          , CAST(avgpagedensity AS VARCHAR(3)) + '%' "Avg.PageDensity(Full)"

          , ForRecCount "ForwardedRec."

     FROM #fraglist

     WHERE LogicalFrag >= @value

     AND INDEXPROPERTY (ObjectId, IndexName, 'IndexDepth') > 0


  DROP TABLE #tableindex

  DROP TABLE #fraglist


  RETURN(0) --sp_showcontig0


  SET NOCOUNT OFF


GO

  

GRANT EXECUTE ON sp_showcontig0 TO PUBLIC

GO



MSSQL 파일그룹, 할당 용량, 현재 사용중인 용량, 사용 가능한 용량 조회

Posted by 나에요임마
2018. 4. 17. 11:26 Program/MSSQL

DB 서버의 디스크가 빵빵하다면 문제가 안되겠지만 언젠가는 증설을 해줘야할 때가 온다.

다음의 쿼리를 활용해서 현재 남은 용량을 파악하고 디스크 증설 사이즈를 예측해야 한다.

대충 몇달동안 이 정도의 데이터를 쌓았고 용량이 이정도이니까 앞으로 얼마나 버틸 수 있겠군..음..


SELECT 

 b.groupname AS 'File Group'

 , Name

 , [Filename]

 , CONVERT (Decimal(15,2),ROUND(a.Size/128.000,2))  [Currently Allocated Space (MB)]

 , CONVERT (Decimal(15,2)

 , ROUND(FILEPROPERTY(a.Name,'SpaceUsed')/128.000,2)) AS [Space Used (MB)]

 , CONVERT (Decimal(15,2)

 , ROUND((a.Size-FILEPROPERTY(a.Name,'SpaceUsed'))/128.000,2)) AS [Available Space (MB)] 

FROM dbo.sysfiles a (NOLOCK) 

JOIN sysfilegroups b (NOLOCK) ON a.groupid = b.groupid 

ORDER BY b.groupname

'Program > MSSQL' 카테고리의 다른 글

MSSQL DBA가 알아야하는 것들 모음  (0) 2018.04.17
MSSQL TABLE REBUILD  (0) 2018.04.17
동적쿼리로 테이블명 인자로 받기  (0) 2018.01.23
연결된서버 사용하기 (linked server)  (2) 2017.12.24
MSSQL DB 관리 쿼리들  (0) 2017.12.20