레이블이 SQL Server 팁인 게시물을 표시합니다. 모든 게시물 표시
레이블이 SQL Server 팁인 게시물을 표시합니다. 모든 게시물 표시

2014년 7월 14일 월요일

세션의 SET 옵션 확인하기

세션의 현재 SET 옵션에 대한 정보를 확인하려면 @@OPTIONS함수를 사용합니다.

제 PC에서 확인해보니 5496이라는 값이 나오는군요.
근데 5496이면 어떤 옵션이 설정되어 있을까요?
MSDN에서는 NOCOUNT 옵션이 설정되어 있는지 확인하기 위해 다음과 같은 방법을 사용합니다.
SET NOCOUNT ON
IF @@OPTIONS & 512 > 0 
RAISERROR ('Current user has SET NOCOUNT turned on.', 1, 1)
NOCOUNT에 해당하는 구성 값이 512이므로 512로 비트 AND 연산을 합니다. 각 구성옵션에 해당 하는 값은 MSDN user options 서버 구성 옵션 구성 항목에서 확인할 수 있습니다. 보다 쉽게 옵션을 확인하는 방법은 @@OPTIONS 리턴값을 이진수로 바꾼다음 각 비트가 1인지 확인하는 것입니다. 다음은 한번에 SET 옵션을 확인하는 방법입니다. 이진수로 바꾸는 방법은 여기를 참조하세요.
DECLARE @OPTION VARCHAR(32)
SET @OPTION = RIGHT(master.DBO.FUNC_DEC2BIN(@@OPTIONS), 15)

PRINT 'SET DISABLE_DEF_CNST_CHK ' + CASE WHEN SUBSTRING(@OPTION, 15, 1) = '1' THEN 'ON' ELSE 'OFF' END
PRINT 'SET IMPLICIT_TRANSACTIONS ' + CASE WHEN SUBSTRING(@OPTION, 14, 1) = '1' THEN 'ON' ELSE 'OFF' END
PRINT 'SET CURSOR_CLOSE_ON_COMMIT ' + CASE WHEN SUBSTRING(@OPTION, 13, 1) = '1' THEN 'ON' ELSE 'OFF' END
PRINT 'SET ANSI_WARNINGS ' + CASE WHEN SUBSTRING(@OPTION, 12, 1) = '1' THEN 'ON' ELSE 'OFF' END
PRINT 'SET ANSI_PADDING ' + CASE WHEN SUBSTRING(@OPTION, 11, 1) = '1' THEN 'ON' ELSE 'OFF' END
PRINT 'SET ANSI_NULLS ' + CASE WHEN SUBSTRING(@OPTION, 10, 1) = '1' THEN 'ON' ELSE 'OFF' END
PRINT 'SET ARITHABORT ' + CASE WHEN SUBSTRING(@OPTION, 9, 1) = '1' THEN 'ON' ELSE 'OFF' END
PRINT 'SET ARITHIGNORE ' + CASE WHEN SUBSTRING(@OPTION, 8, 1) = '1' THEN 'ON' ELSE 'OFF' END
PRINT 'SET QUOTED_IDENTIFIER ' + CASE WHEN SUBSTRING(@OPTION, 7, 1) = '1' THEN 'ON' ELSE 'OFF' END
PRINT 'SET NOCOUNT ' + CASE WHEN SUBSTRING(@OPTION, 6, 1) = '1' THEN 'ON' ELSE 'OFF' END
PRINT 'SET ANSI_NULL_DFLT_ON ' + CASE WHEN SUBSTRING(@OPTION, 5, 1) = '1' THEN 'ON' ELSE 'OFF' END
PRINT 'SET ANSI_NULL_DFLT_OFF ' + CASE WHEN SUBSTRING(@OPTION, 4, 1) = '1' THEN 'ON' ELSE 'OFF' END
PRINT 'SET CONCAT_NULL_YIELDS_NULL ' + CASE WHEN SUBSTRING(@OPTION, 3, 1) = '1' THEN 'ON' ELSE 'OFF' END
PRINT 'SET NUMERIC_ROUNDABORT ' + CASE WHEN SUBSTRING(@OPTION, 2, 1) = '1' THEN 'ON' ELSE 'OFF' END
PRINT 'SET XACT_ABORT ' + CASE WHEN SUBSTRING(@OPTION, 1, 1) = '1' THEN 'ON' ELSE 'OFF' END
제 컴퓨터에서 실행했을때 결과입니다.
SET DISABLE_DEF_CNST_CHK OFF
SET IMPLICIT_TRANSACTIONS OFF
SET CURSOR_CLOSE_ON_COMMIT OFF
SET ANSI_WARNINGS ON
SET ANSI_PADDING ON
SET ANSI_NULLS ON
SET ARITHABORT ON
SET ARITHIGNORE OFF
SET QUOTED_IDENTIFIER ON
SET NOCOUNT OFF
SET ANSI_NULL_DFLT_ON ON
SET ANSI_NULL_DFLT_OFF OFF
SET CONCAT_NULL_YIELDS_NULL ON
SET NUMERIC_ROUNDABORT OFF
SET XACT_ABORT OFF

2014년 7월 11일 금요일

10진수를 2진수로 바꾸기

중고등학교 수학시간에 10진수를 2진수로 변환하는 방법을 배웠을 것입니다.
대충 방법을 설명해보면...
모릅니다. -_-;;

음... 그래도 조금 생각나는것이... 2로 계속 나누어서... 음...
모르겠네요.

그냥 CONVERT와 REPLACE를 이용해서 10진수를 2진수로 바꾸어보겠습니다.
비트마스크 할일이 있어서 만들어보았습니다.

다음 코드는 10진수 100을 2진수로 만드는 함수입니다.
CREATE FUNCTION FUNC_DEC2BIN (@DEC INT) RETURNS VARCHAR(255)
  
AS
  
BEGIN
        DECLARE @BIN VARCHAR(255)
   
        SET @BIN = SUBSTRING(master.dbo.fn_varbintohexstr(CONVERT(VARBINARY(255), @DEC)), 3, 255)
   
        SET @BIN = REPLACE(@BIN, '0', '0000')
        SET @BIN = REPLACE(@BIN, '1', '0001')
        SET @BIN = REPLACE(@BIN, '2', '0010')
        SET @BIN = REPLACE(@BIN, '3', '0011')
        SET @BIN = REPLACE(@BIN, '4', '0100')
        SET @BIN = REPLACE(@BIN, '5', '0101')
        SET @BIN = REPLACE(@BIN, '6', '0110')
        SET @BIN = REPLACE(@BIN, '7', '0111')
        SET @BIN = REPLACE(@BIN, '8', '1000')
        SET @BIN = REPLACE(@BIN, '9', '1001')
        SET @BIN = REPLACE(@BIN, 'A', '1010')
        SET @BIN = REPLACE(@BIN, 'B', '1011')
        SET @BIN = REPLACE(@BIN, 'C', '1100')
        SET @BIN = REPLACE(@BIN, 'D', '1101')
        SET @BIN = REPLACE(@BIN, 'E', '1110')
        SET @BIN = REPLACE(@BIN, 'F', '1111')
   
        RETURN @BIN
END

2014년 6월 18일 수요일

읽기 전용 테이블 만들기

어떤 테이블이 읽기 전용이 되어 야 할경우 어떻게 해야 할까요?

오라클의 경우 11G 이후로는 읽기 전용 테이블이 가능하다고 하는데
애석하게도 SQL Server에서는 읽기 전용 테이블은 없는데요. 제가 알기로는...
그래도 꼼수를 동원해서 제가 한번 만들어보겠습니다.

여러가지 방법이 있는데요.

1. 데이터베이스를 읽기 전용으로 만드는 방법입니다.
데이터베이스를 읽기 전용으로 설정하는 것은 간단합니다.
ALTER DATABASE database_name SET READ_ONLY
그런데 이 경우 모든 테이블이 읽기 전용이 되어버리겠네요. 2. 다음은 CHECK 제약조건을 이용하는 방법입니다. CHECK 제약 조건은 열에서 허용되는 값을 제한하여 도메인 무결성을 강제 적용하는데 사용하는데요. CHECK 제약 조건이 FALSE로 평가되면 값을 거부합니다. 그래서 항상 FALSE로 평가되는 CHECK 제약조건을 걸어서 수정을 못하게 하는 방법입니다. 일단 테이블을 하나 만들고 데이터를 집어 넣습니다.
CREATE TABLE TBL1 (COL1 INT, COL2 DATETIME)
GO
INSERT INTO TBL1 SELECT 1, GETDATE()
GO
INSERT INTO TBL1 SELECT 2, GETDATE()
GO
INSERT INTO TBL1 SELECT 3, GETDATE()
GO
INSERT INTO TBL1 SELECT 4, GETDATE()
GO
INSERT INTO TBL1 SELECT 5, GETDATE()
그리고 여기에 항상 FALSE로 평가되는 CHECK 제약조건을 겁니다. 예를 들어 0 = 1
ALTER TABLE TBL1 ADD CONSTRAINT CHK_TBL1_READONLY CHECK (0 = 1)
그런데 문제가 생겼습니다. 에러가 나네요.
메시지 547, 수준 16, 상태 0, 줄 1
ALTER TABLE 문이 CHECK 제약 조건 "CHK_TBL1_READONLY"과(와) 충돌했습니다.
데이터베이스 "TestDB", 테이블 "dbo.TBL1"에서 충돌이 발생했습니다.
이미 존재하는 데이터들이 CHECK 제약조건에 걸려서 충돌이 나는 것입니다. NOCHECK 옵션을 사용하여 CHECK 제약조건을 생성할 때 기존 데이터를 검사하지 않도록 해야겠네요.
ALTER TABLE TBL1 WITH NOCHECK ADD CONSTRAINT CHK_TBL1_READONLY CHECK (0 = 1)
자 이제 CHECK 제약 조건이 생성되었습니다. 데이터를 한건 더 넣어보겠습니다.
INSERT INTO TBL1 SELECT 6, GETDATE()
에러가 발생하네요.
메시지 547, 수준 16, 상태 0, 줄 1
INSERT 문이 CHECK 제약 조건 "CHK_TBL1_READONLY"과(와) 충돌했습니다.
데이터베이스 "TestDB", 테이블 "dbo.TBL1"에서 충돌이 발생했습니다.
문이 종료되었습니다.
CHECK 제약조건을 이용하면 INSERT나 UPDATE는 막을 수 있습니다. 그런데 DELETE는 막을 수가 없습니다. 읽기 전용 테이블이라고 보긴 좀 무리가 있네요. 3. 트리거를 이용한 방법입니다. 테이블에 INSERT, UPDATE, DELETE 할때 ROLLBACK을 수행하는 트리거를 생성하는 방법입니다.
CREATE TRIGGER TRG_IUD_TBL1_READONLY ON TBL1 FOR INSERT, UPDATE, DELETE

AS

BEGIN
        RAISERROR ('TBL1은 읽기 전용입니다.', 16, 1)
        ROLLBACK TRANSACTION
END
여기에 데이터를 입력하면
메시지 50000, 수준 16, 상태 1, 프로시저 TRG_IUD_TBL1_READONLY, 줄 6
TBL1은 읽기 전용입니다.
메시지 3609, 수준 16, 상태 1, 줄 1
트리거가 발생하여 트랜잭션이 종료되었습니다. 일괄 처리가 중단되었습니다.
이렇게 에러가 발생하게 됩니다. 이 방법은 INSERT, UPDATE, DELETE 모두를 막을 수 있겠네요. 4. 다음은 Read Only Filegroup에 테이블을 생성하는 방법입니다.
/* Database 생성 */
CREATE DATABASE TestDB
GO
/* 파일그룹 추가 */
ALTER DATABASE TestDB ADD FILEGROUP Read_Only_FileGroup
GO
/* 파일 추가 */
ALTER DATABASE TestDB
ADD FILE (NAME = N'Read_Only_Tables', FILENAME = N'D:\TestDB_Read_Only.ndf', SIZE = 4MB, FILEGROWTH = 4MB)
TO FILEGROUP Read_Only_FileGroup
GO
/* Read_Only_FileGroup에 테이블 생성, 아직은 이름만 Read Only입니다. */
CREATE TABLE TBL2 (COL1 INT, COL2 DATETIME) ON Read_Only_FileGroup
GO
/* 데이터 INSERT */
INSERT INTO TBL2 SELECT 1, GETDATE()
GO
INSERT INTO TBL2 SELECT 2, GETDATE()
GO
INSERT INTO TBL2 SELECT 3, GETDATE()
GO
/* 파일그룹을 READ ONLY로 설정 */
ALTER DATABASE TestDB MODIFY FILEGROUP Read_Only_FileGroup READONLY
여기에 데이터를 입력하면
INSERT INTO TBL2 SELECT 4, GETDATE()
에러가 발생하게 됩니다.
메시지 652, 수준 16, 상태 1, 줄 1
테이블 "dbo.TBL2"(RowsetId 72057594038845440)에 대한 인덱스 ""이(가) 수정할 수 없는 읽기 전용 파일 그룹("Read_Only_FileGroup")에 있습니다.
5. 다음은 권한 설정을 이용한 방법입니다.
DENY INSERT, UPDATE, DELETE ON TBL2 TO Public
이렇게 한 후 데이터를 입력하면 에러가 나게됩니다.
메시지 229, 수준 14, 상태 5, 줄 1
개체 'TBL2', 데이터베이스 'TestDB', 스키마 'dbo'에 대한 INSERT 권한이 거부되었습니다.
6. 다음은 VIEW를 이용한 방법인데요. Read Only로 설정할 테이블의 이름을 바꾸고 원래 테이블 이름으로 VIEW를 만듭니다. 이 VIEW에 상수 필드를 추가하고 UNION 합니다.
SP_RENAME 'TBL2', 'TBL2_Orign'
GO
CREATE VIEW TBL2

AS

SELECT COL1, COL2 FROM TBL2_Orign
UNION ALL
SELECT 0, GETDATE() WHERE 1 = 0
이제 이 뷰에 INSERT를 해보겠습니다.
INSERT INTO TBL2 SELECT 5, GETDATE()
에러가 나네요.
메시지 4406, 수준 16, 상태 1, 줄 1
뷰 또는 함수 'TBL2'은(는) 파생 필드나 상수 필드를 포함하므로 업데이트 또는 삽입하지 못했습니다.
DELETE를 해보겠습니다.
DELETE TBL2
이것도 에러가 나네요.
메시지 4426, 수준 16, 상태 1, 줄 1
뷰 'TBL2'의 정의에 UNION 연산자가 포함되어 있으므로 이 뷰를 업데이트할 수 없습니다.
UPDATE를 해보겠습니다.
UPDATE TBL2 SET COL2 = GETDATE() WHERE COL1 = 1
이것 역시 에러 납니다.
메시지 4406, 수준 16, 상태 1, 줄 1
뷰 또는 함수 'TBL2'은(는) 파생 필드나 상수 필드를 포함하므로 업데이트 또는 삽입하지 못했습니다.

VARCHAR(8000) 사용시 주의 사항

왜 하필 VARCHAR(8000)이냐구요??
왜냐하면 VARCHAR(8000)은 특별하기 때문이죠. ^^

일단 기본적인 사항부터 점검하겠습니다.
VARCHAR(8) 컬럼을 가진 테이블 하나를 만들어보겠습니다.
CREATE TABLE TBL1 (COL1 VARCHAR(8))
이 테이블에 데이터를 넣어보겠습니다.
INSERT INTO TBL1 VALUES ('초짜해커')
아무 문제 없죠? 그럼 이 테이블에 데이터가 8Byte를 넘는 데이터를 넣어보겠습니다.
INSERT INTO TBL1 VALUES (REPLICATE('A', 1) + '초짜해커')
어떻게 될까요? 에러가 납니다.
메시지 8152, 수준 16, 상태 14, 줄 1
문자열이나 이진 데이터는 잘립니다.
문이 종료되었습니다.
일반적으로 허용 범위 이상의 데이터를 넣으려고 하면 에러가 발생합니다. 이번에는 VARCHAR(8000)을 가진 테이블을 하나 만들어보겠습니다.
CREATE TABLE TBL2 (COL1 VARCHAR(8000))
자... 이번에는 바로 8000Byte를 넘는 데이터를 넣어보겠습니다. 당연히 에러가 나겠죠?
INSERT INTO TBL2 VALUES (REPLICATE('A', 7993) + '초짜해커')
어찌된 일인지 에러 없이 행이 추가됩니다. 도데체 어떤 데이터가 들어 있는지 조회해보겠습니다.
SELECT COL1 = RIGHT(COL1, 10) FROM TBL2
결과는
COL1
--------------------
AAAAAA초짜해?
마지막 문자열이 좀 이상하게 들어갔네요. 실제로 어떤 값이 들어 있는지 Binary로 변환해서 살펴보겠습니다.
SELECT 원문 = RIGHT(COL1, 5), 이진값 = CONVERT(VARBINARY(100), RIGHT(COL1, 5)) FROM TBL2
결과는
원문        이진값
--------    ------------------------
A초짜해?    0x41C3CAC2A5C7D8C4
입니다. "초짜해커"의 Binary값은 0xC3CAC2A5C7D8C4BF 인데 맨 마지막 C4BF중에 BF는 잘리고 C4까지만 들어갔습니다. 테이블에 아무 문제 없는것인지 DBCC CHECKTABLE(TBL2)를 해보면 에러가 납니다.
'TBL2'의 DBCC 결과입니다.
메시지 2570, 수준 16, 상태 3, 줄 1
개체 ID 2121058592, 인덱스 ID 0, 파티션 ID 72057594038845440, 할당 단위 ID 72057594039894016("In-row data" 유형)의 페이지 (1:80), 슬롯 0. 열 "COL1" 값이 데이터 형식 "varchar"의 범위를 벗어났습니다.
열을 올바른 값으로 업데이트하십시오.
1개 페이지에 개체 "TBL2"에 대한 행이 0개 있습니다.
CHECKTABLE이(가) 테이블 'TBL2'(개체 ID 2121058592)에서 0개의 할당 오류와 1개의 일관성 오류를 찾았습니다.
DBCC 실행이 완료되었습니다. DBCC에서 오류 메시지를 출력하면 시스템 관리자에게 문의하십시오.
COL1의 값이 데이터 형식 varchar의 범위를 벗어났다는군요. 문제가 무엇일까요? 저는 심심하던 차에 VARCHAR(2)부터 VARCHAR(8000)까지 테이블을 만들어서 딱 1Byte를 넘는 데이터를 모두 넣어봤습니다. 8000이하에서는 모두 에러를 내면서 행이 추가되지 않았는데 8000일때만 데이터가 들어갔습니다. 노가다 안하고 스크립트로 순식간에 했습니다. 왜 이런일이 일어날까요? 이 문제는 "+" 연산자의 문제인데요. 자세한 내용은 MSDN에 있습니다. 문서를 잘 읽어보면 주의사항에
문자열 연결의 결과가 제한치인 8,000바이트를 초과하면 결과가 잘립니다.
하지만 연결된 문자열 중 하나 이상이 큰 값 형식이면 잘림은 발생하지 않습니다.
라고 나옵니다. 여기서 "큰 값 형식"이란 VARCHAR(MAX)등을 의미하구요. VARCHAR(MAX)와 연산하지 않는 이상은 8000Byte 이상은 잘린다는 설명입니다. 앞의 예에서 살펴보면 "A" 7993개와 "초짜해커"를 "+"연산을 하면 마지막 "커"가 잘린다는 거죠. 그런데 "커"는 2Byte(0xC4BF)이기 때문에 뒤쪽 1Byte(0xBF)만 잘리고 앞쪽 1Byte(0xC4가 문자열에 포함되는 것이죠. 문제는 이 반쪽짜리 1Byte가 VARCHAR형식에서는 포함될 수 없는 데이터이기 때문에 일관성 오류가 일어나는 것입니다. 요약하면 VARCHAR(8000)에 "A......A초짜해커"를 INSERT하려고 하면 에러가 없이 INSERT되는것이 아니라 "커"의 앞 1Byte까지만 잘려서 들어가는 것이고, 이게 문제를 일으킨다는 것입니다. 문자열을 연산할때는 항상 이 8000을 주의해야 하는데요. 만약 VARCHAR(8000)컬럼 두개를 연결해서 계산된 컬럼을 만들면 어떻게 될까요? 두번째 컬럼의 일부분은 잘리게 됩니다. 그래서 적절히 VARCHAR(MAX)로 형변환 후 연산해야 합니다.

2014년 6월 16일 월요일

Windows 8에 SQL Server 2005 설치하기

Windows 8에는 정상적인 방법으로는 SQL Server 2005 설치가 안됩니다. 설치 최종단계에서 다음과 같은 에러메시지가 나타나면서 좌절을 안겨줍니다.
신기하게도 SQL Server 2000의 경우는 설치 프로그램을 Windows XP SP3로 호환 모드를 설정하면 무리없이 설치가 됩니다. 그럼 어떻게 해야 할까요?? SQL Server 2000을 설치하세요!! 미리 말씀드리자면 SQL Server 2005 SP3나 SP4는 잘 설치됩니다. ????? 흠.... SQL Server 2005도 설치를 못하고 있는데 서비스팩은 잘 설치 된다구요??? 사실은 이게 힌트인데요. 설치 마지막 단계에서 서비스 관련 파일로 바꿔치기 한다음 "다시 시도"를 클릭하는게 핵심입니다. 여튼간 전체 설치 과정에 대해서 다시 정리해보겠습니다. 그대로 따라하면 잘 설치됩니다. 1. 일단 준비물이 필요합니다. SQL Server 2005와 서비스팩 3 이상이 설치된 컴퓨터에서 sqlos.dll과 sqlservr.exe파일을 복사해옵니다. 위치는 C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Binn 입니다. 2. 서비스팩 설치 디스크 .\Servers\Setup 폴더의 sqlncli.msi나 sqlncli_x64.msi를 설치합니다. 3. 이제 SQL Server 2005 설치를 시작합니다. 계속 하다보면 위의 그림과 같은 에러메시지를 만나게 됩니다. 이때 취소를 누르지 말고 미리 준비한 sqlos.dll과 sqlserver.exe파일을 같은 위치에 붙여 넣습니다. 4. 이제 "다시 시도"를 누릅니다. 그러면 정상적으로 서비스가 시작됩니다. 5. 서비스팩을 설치합니다. 참고로 Windows 8에서 .net framework 3.5 설치하기가 까다로운데 간단히 다음 명령으로 설치 가능합니다. 관리자 모드의 명령 프롬프트에서 다음 명령을 실행하세요.
DISM /Online /Enable-Feature /FeatureName:NetFx3 /All /LimitAccess /Source:L:\sources\sxs
/Source 다음의 L은 Windows 8 설치 미디어가 있는 드라이브명입니다.

WMI에서 Win32_PerfRawData_PerfProc_Process가 보이지 않는다!!!

SQL Server Process가 사용하는 CPU와 Memory 정보를 얻기 위해서 Win32_PerfRawData_PerfProc_Process Class를 조회했었는데 갑자기 클래스 자체가 보이지를 않네요.

이럴 경우 조치사항입니다.

1. 레지스트리 확인
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\PerfProc\Performance의 Disable Performance Counters가 1이면 0으로 수정합니다.

2. 서비스 재시작
Windows Management Instrumentation 서비스를 재시작합니다.

2014년 5월 13일 화요일

데이터 형식 변환

지난 번 포스팅에서 암시적 형변환과 그 우선순위에 대해서 살펴보았습니다.

그렇다면 데이터의 형식은 자유롭게 변환 가능할까요?
다음 표는 그 호환여부를 보여줍니다.
특별히 형변환에서 어려움을 겪을 만한 부분은 없지만 문제가 생길만한 상황을 상정해보겠습니다. 어느 DB설계자가 월급을 아주 많이 줄 생각으로 급여 테이블의 급여란을 TEXT형식으로 했다고 가정해봅시다.
CREATE TABLE 급여 (사원번호 INT NOT NULL, 급여일 DATETIME NOT NULL, 총급여 TEXT NOT NULL)
그리고 DATA를 넣습니다.
INSERT INTO 급여 (사원번호, 급여일, 총급여) VALUES (1, '2014-05-25', 10000000)
처음부터 심상치 않은 에러가 뜹니다.
메시지 206, 수준 16, 상태 2, 줄 1
피연산자 유형 충돌: int은(는) text과(와) 호환되지 않습니다.
음... 아... TEXT니까 문자열로 넣어야지...
INSERT INTO 급여 (사원번호, 급여일, 총급여) VALUES (1, '2014-05-25', '10000000')
이제야 데이터가 들어갑니다. 근데 TEXT는 다루기도 어렵고 인덱스 설정도 안되고... 그래서 급여 열을 BIGINT 형식으로 바꾸기로 합니다. 월급을 20억이상 줄 생각인듯...
ALTER TABLE 급여 ALTER COLUMN 총급여 BIGINT NOT NULL
그랬더니 또 에러가 나네요.
메시지 4927, 수준 16, 상태 1, 줄 1
열 '총급여'을 데이터 형식 bigint(으)로 변경할 수 없습니다.
왜 그랬을까요? 표를 한번 봅시다. 원본 축에서 TEXT를 찾고 대상 축에서 BIGINT를 찾아보면 "변환이 허용되지 않음"으로 나옵니다. CONVERT나 ALTER TABLE 명령 등으로 직접 변환 할 수 없다는 말이죠. 흠... 그럼 영원히 BIGINT로는 수정 할 수 없는 걸까요?? 형식이 TEXT형식이지만 데이터는 오로지 숫자만 들어가 있습니다. TEXT를 BIGINT로 바꾸는건 허용되지 않지만 TEXT를 VARCHAR로 바꾸었다가 VARCHAR를 BIGINT로 바꾸는건 가능합니다.
ALTER TABLE 급여 ALTER COLUMN 총급여 VARCHAR(20) NOT NULL
GO
ALTER TABLE 급여 ALTER COLUMN 총급여 BIGINT NOT NULL
정상적으로 변환 되네요. 참고자료 데이터 형식 변환(데이터베이스 엔진)

암시적 형변환에서 데이터 형식 우선 순위

형식이 다른 두 데이터를 연산할 경우 암시적 변환이 일어납니다.
간단한 예를 한번 봅시다.
DECLARE @A CHAR(1)
DECLARE @B INT

SET @A = '1'
SET @B = 1

SELECT @A + @B
결과는 '2' 입니다. CHAR형식이 INT로 암시적 변환이 일어난 후 연산이 된 것입니다. 그러면...
DECLARE @A CHAR(1)
DECLARE @B INT

SET @A = 'A'
SET @B = 1

SELECT @A + @B
이것은 어떤 결과가 나올까요? A1??
메시지 245, 수준 16, 상태 1, 줄 7
varchar 값 'A'을(를) 데이터 형식 int(으)로 변환하지 못했습니다.
이런 에러가 나는 군요. 그러면 두개의 다른 데이터 형식을 연산할 때 어떤 순서로 변환이 일어날까요? MSDN에 의하면 다음 순서로 일어납니다.
사용자 정의 데이터 형식(가장 높음)
sql_variant
xml
datetimeoffset
datetime2
datetime
smalldatetime
date
time
float
real
decimal
money
smallmoney
bigint
int
smallint
tinyint
bit
ntext
text
image
timestamp
uniqueidentifier
nvarchar(nvarchar(max) 포함)
nchar
varchar(varchar(max) 포함)
char
varbinary(varbinary(max) 포함)
binary(가장 낮음)
예제와 함께 살펴보면 char 형식은 우선순위가 28위 int는 16위 입니다. 그래서 두 형식을 연산하면 int로 암시적 변환이 됩니다. char형식의 변수에 '1', '2' 같은 숫자가 들어가 있다면 문제없이 변환이 되겠지만 'a', 'b' 등 문자가 들어가 있으면 int로 변환을 하려다가 에러가 발생하게 됩니다. 그런데 만약
DECLARE @A CHAR(1)
DECLARE @B INT

SET @A = 'A'
SET @B = 1

SELECT @A + @B
이 예제에서 'A1' 이라는 결과를 얻고 싶을때는 어떻게 해야 할까요? 그럴때는 CONVERT나 CAST 함수를 통해서 명시적으로 변환을 해야 합니다.
DECLARE @A CHAR(1)
DECLARE @B INT

SET @A = 'A'
SET @B = 1

SELECT @A + CONVERT(CHAR(1), @B)
이렇게요... 암시적 변환으로 인해 원치 않는 데이터가 나올 수도 있지만 암시적 변환은 인덱스 사용에도 문제를 일으킵니다. 아래 그림은 CounterTemp라는 테이블의 내용을 막강 프로시져 SP_HELPX를 통해 살펴본 모습입니다.
CounterTemp는 varchar형식의 CounterID열에 Clustered Index를 가진 테이블입니다. 여기에 CounterID가 100인 데이터를 쿼리해보겠습니다.
SELECT * FROM CounterTemp WHERE CounterID = 100
그리고 실행 계획을 보니...
어찌된 일인지 Clustered Index Scan을 했습니다. 무엇때문에 그럴까요? 조건자를 보니까 CONVERT_IMPLICT라는게 보입니다. VARCHAR와 INT의 형변환 경합에서 INT가 우선이므로 컬럼과 조건이 모두 암시적 형변환이 일어난 것입니다. 형변환 때문에 인덱스를 사용하지 못하고 Scan이 되어 버린 것이지요. 그럼 어떻게 해야 인덱스를 정상적으로 사용할까요? 인덱스 컬럼의 데이터 형식과 조건의 데이터 형식을 맞추어야 합니다.
DECLARE @A VARCHAR(10)

SET @A = '100'

SELECT * FROM CounterTemp WHERE CounterID = @A
이렇게 쿼리 한 후 실행계획을 다시 보면 정상적으로 인덱스를 Seek한것을 볼 수 있습니다.
참고자료 데이터 형식 우선 순위(Transact-SQL)

2014년 5월 12일 월요일

기존 컬럼을 IDENTITY 속성으로 변경하기

테스트를 위해 테이블을 하나 만듭니다.
CREATE TABLE TBL1 (COL1 INT, COL2 DATETIME)
COL1에 IDENTITY 속성을 부여합니다.
ALTER TABLE TBL1 ALTER COLUMN COL1 INT IDENTITY(1,1)
결과는
메시지 156, 수준 15, 상태 1, 줄 1
키워드 'IDENTITY' 근처의 구문이 잘못되었습니다.
기존 컬럼을 IDENTITY열로 수정하는 것은 안됩니다. SQL SERVER의 ALTER TABLE 문법에는 IDENTITY를 추가하는것은 있어도 ALTER는 허용하지 않습니다. 된다구요?? 해보셨다구요?? SSMS로 하면 된다구요?? 예 됩니다. ㅠㅠ 일단 해보겠습니다. 일단 SSMS의 테이블 디자인 모드를 사용하여 COL1에 IDENTITY를 설정합니다.
그리고 나서 저장을 하면... 에러나네요.
근데 에러의 이유가 "테이블을 다시 만들어야 하는 변경 내용 저장 사용 안 함" 옵션을 사용했기 때문이랍니다. 기분이 꺼림칙 하지만 저 옵션을 사용 안하도록 설정합니다.
그런 다음 다시 COL1에 IDENTITY 속성을 설정하고 저장을 해 보았습니다. 됩니다!!!!! 근데 이 과정을 프로파일러로 감시를 해보았습니다. SSMS의 모든 활동은 프로파일러로 감시가 가능한데요. 컬럼에 IDENTITY 속성을 설정하는 동안 프로파일러를 켜 놓고 어떤 일이 벌어지는지 봤더니...
CREATE TABLE DBO.TMP_TBL1(
COL1 INT NOT NULL IDENTITY (1, 1),
COL2 DATETIME NULL)
ON [PRIMARY]

GO

ALTER TABLE DBO.TMP_TBL1 SET (LOCK_ESCALATION = TABLE)

GO

SET IDENTITY_INSERT DBO.TMP_TBL1 ON

GO

IF EXISTS(SELECT * FROM DBO.TBL1)
        EXEC('INSERT INTO DBO.TMP_TBL1 (COL1, COL2)
        SELECT COL1, COL2 FROM DBO.TBL1 WITH (HOLDLOCK TABLOCKX)')

GO

SET IDENTITY_INSERT DBO.TMP_TBL1 OFF

GO

DROP TABLE DBO.TBL1

GO

EXECUTE SP_RENAME N'DBO.TMP_TBL1', N'TBL1', 'OBJECT'
예... 수정하는게 아니었군요 1.Tmp_TBL1을 만들고 2.TBL1의 데이터를 Tmp_TBL1에 부어 넣은 다음 3.기존 TBL1은 DROP 하고 4.Tmp_TBL1의 이름을 수정하는 것이었습니다. 혹시나 해서 TBL1을 부모 테이블로 하는 자식 테이블을 만들고 Foreign Key를 설정한 후 해보면 상황은 더욱 심각합니다. 위의 과정에 포린키를 삭제했다가 다시 설정하는 과정이 포함됩니다. 이 과정을 운영중인 DB에서 실행하면 어떻게 될까요? 해보고 알려주.... 아니 하지 마세요!!! 만약 필요에 의해 IDENTITY컬럼으로 수정해야 할 경우는 어떻게 해야 할까요? 동일한 사양의 테이블을 생성하고 SWITCH하는 방법이 있는데 다음은 그 스크립트입니다.
CREATE TABLE TBL1 (COL1 INT NOT NULL, COL2 DATETIME)

GO

INSERT INTO TBL1
SELECT 1, GETDATE() UNION ALL
SELECT 2, GETDATE() UNION ALL
SELECT 3, GETDATE()

GO

CREATE TABLE TBL2 (COL1 INT NOT NULL IDENTITY(1,1), COL2 DATETIME)

GO 

ALTER TABLE TBL1 SWITCH TO TBL2

GO

DROP TABLE TBL1

GO

EXEC SP_RENAME 'TBL2', 'TBL1'
그런데 만약 TBL1을 참조하는 포린키가 있다면 포린키를 다시 작성하는 작업이 추가되어야 하고 이 작업 역시 만만한 작업은 아니므로 운영중에 실시하면 안됩니다.

IDENTITY열은 UPDATE가 되나요?

테스트를 위해 IDENTITY열을 포함한 테이블을 하나 만듭니다.
CREATE TABLE TBL1 (COL1 INT IDENTITY(1,1), COL2 DATETIME)
이 테이블에 데이터를 3건 집어 넣습니다.
INSERT INTO TBL1 (COL2) SELECT GETDATE()
GO 3
데이터는 다음과 같습니다.
COL1    COL2
1       2014-05-12 12:13:20.727
2       2014-05-12 12:13:20.740
3       2014-05-12 12:13:20.747
IDENTITY가 3까지 증가하였습니다. 여기에 임의로 IDENTITY값 4를 가진 데이터를 추가하려면 IDENTITY_INSERT ON을 사용합니다.
SET IDENTITY_INSERT TBL1 ON
GO
INSERT INTO TBL1 (COL1, COL2) SELECT 4, GETDATE()
GO
SET IDENTITY_INSERT TBL1 OFF
결과는 다음과 같습니다.
COL1    COL2
1       2014-05-12 12:13:20.727
2       2014-05-12 12:13:20.740
3       2014-05-12 12:13:20.747
4       2014-05-12 12:15:46.210
이번에는 IDENTITY열을 수정해보겠습니다.
UPDATE TBL1 SET COL1 = 5 WHERE COL1 = 1
이 문장을 수행했더니 다음과 같은 에러가 발생했습니다.
메시지 8102, 수준 16, 상태 1, 줄 1
ID 열 'COL1'을(를) 업데이트할 수 없습니다.
무엇을 잘못했을까요?? 아하!! IDENTITY_INSERT를 설정하지 않았군요. 이번엔 이렇게 해보겠습니다.
SET IDENTITY_INSERT TBL1 ON
GO
UPDATE TBL1 SET COL1 = 5 WHERE COL1 = 1
GO
SET IDENTITY_INSERT TBL1 OFF
역시나 마찬가지로 다음의 에러가 발생합니다.
메시지 8102, 수준 16, 상태 1, 줄 1
ID 열 'COL1'을(를) 업데이트할 수 없습니다.
혹시나 IDENTITY_UPDATE가 있는지 살펴보았지만 그런건 없습니다. 결론은 IDENTITY열의 UPDATE는 안됩니다.

SQL Server Agent는 약속을 잘 지키나요?

SQL Server의 Agent에 대해서 두가지 의문이 들었습니다.
첫째는, Job을 만들면 즉시 한번 실행이 되는지 아니면 Interval 동안 기다리는지...
둘째는, 10초 간격으로 Interval을 설정하면 1분동안 6번을 실행하는지 입니다.

테스트를 위해 테이블을 하나 만듭니다.
CREATE TABLE TBL1 (COL1 INT IDENTITY(1,1), COL2 DATETIME)
그리고 이 테이블에 Insert하는 프로시저를 만듭니다.
CREATE PROC USP_T_TBL1

AS

INSERT INTO TBL1 (COL2)
SELECT GETDATE()
그리고 10분에 한번씩 실행하는 Job을 만들고 테이블을 조회해봅니다. 1분동안 기다린 후 조회해봐도 데이터는 없네요. 두번째 테스트를 위해서 Job의 Interval을 10초로 설정하고 1분이 지나면 프로시져의 실행 시간이 Interval보다 길어지게 만들기 위하여 20초를 대기하도록 프로시저를 수정합니다.
ALTER PROC USP_T_TBL1

AS

WAITFOR DELAY '00:00:20'

INSERT INTO TBL1 (COL2)
SELECT GETDATE()
그리고 1분간 수행 후 데이터를 조회해봤습니다. 정확한 테스트를 위해 손목시계로 시간을 측정하였습니다. 결과는 다음과 같습니다.
처음 6번째 줄까지는 10초에 한번씩 실행되다가 7번째 부터는 대략 30초마다 실행된것을 확인 할 수 있습니다. 결론은, 1. SQL Agent는 Job을 생성하면 일단 Interval동안 기다린 다음 실행된다. 2. 바쁘면 건너뛴다. PS. 만약 스케줄의 시작 시간이 아직 지나지 않았으면 그 시간에는 한번 수행됩니다.

매주 월요일 08시에 실행되는 Job이 뭐죠?

만약 누가 저런 질문을 한다면 어떻게 찾아야 할까요?
작업 하나 하나 속성 대화상자를 열어서 일정을 확인해야 하나요??
근데 작업이 100개가 넘어가면??

그래서 모든 Job에 대한 Step과 Schedule을 한번에 조회할 수 있는 쿼리를 만들어 봤습니다.
하나의 쿼리와 두개의 펑션으로 이루어져 있습니다.
CREATE FUNCTION DBO.FUNC_job_schedule(@schedule_id int) RETURNS VARCHAR(8000)

AS

BEGIN
        DECLARE @schedule VARCHAR(1000)

        DECLARE @freq_type INT
        DECLARE @freq_interval INT
        DECLARE @freq_subday_type INT
        DECLARE @freq_subday_interval VARCHAR(3)
        DECLARE @freq_relative_interval INT
        DECLARE @freq_recurrence_factor VARCHAR(3)
        DECLARE @active_start_date VARCHAR(10)
        DECLARE @active_end_date VARCHAR(10)
        DECLARE @active_start_time VARCHAR(8)
        DECLARE @active_end_time VARCHAR(8)

        SELECT @freq_type = freq_type
                , @freq_interval = freq_interval
                , @freq_subday_type = freq_subday_type
                , @freq_subday_interval = CONVERT(VARCHAR(3), freq_subday_interval)
                , @freq_relative_interval = freq_relative_interval
                , @freq_recurrence_factor = CONVERT(VARCHAR(3), freq_recurrence_factor)
                , @active_start_date = STUFF(STUFF(CONVERT(VARCHAR(8), active_start_date), 7, 0, '-'), 5, 0, '-')
                , @active_end_date = STUFF(STUFF(CONVERT(VARCHAR(8), active_end_date), 7, 0, '-'), 5, 0, '-')
                , @active_start_time = STUFF(STUFF(RIGHT('000000' + CONVERT(VARCHAR(6), active_start_time), 6), 5, 0, ':'), 3, 0, ':')
                , @active_end_time = STUFF(STUFF(RIGHT('000000' + CONVERT(VARCHAR(6), active_end_time), 6), 5, 0, ':'), 3, 0, ':')
        FROM    msdb.dbo.sysschedules
        WHERE   schedule_id = @schedule_id

        IF @freq_type = 1 BEGIN
                SET @schedule = @active_start_date + ' ' + @active_start_time + '에 발생합니다.'
        END ELSE IF @freq_type = 4 BEGIN
                SET @schedule = CASE WHEN @freq_interval = '1' THEN '매일 ' ELSE '매 ' + CONVERT(VARCHAR(3), @freq_interval) + '일마다 ' END
        END ELSE IF @freq_type = 8 BEGIN
                SET @schedule = CASE WHEN @freq_recurrence_factor = '1' THEN '매주 ' ELSE '매 ' + @freq_recurrence_factor + '주마다 ' END

                DECLARE @weekday VARCHAR(30)

                SET @weekday = ''

                IF @freq_interval >= 64 BEGIN SET @weekday = ',토'; SET @freq_interval = @freq_interval - 64 END
                IF @freq_interval >= 32 BEGIN SET @weekday = ',금' + @weekday; SET @freq_interval = @freq_interval - 32 END
                IF @freq_interval >= 16 BEGIN SET @weekday = ',목' + @weekday; SET @freq_interval = @freq_interval - 16 END
                IF @freq_interval >= 8 BEGIN SET @weekday = ',수' + @weekday; SET @freq_interval = @freq_interval - 8 END
                IF @freq_interval >= 4 BEGIN SET @weekday = ',화' + @weekday; SET @freq_interval = @freq_interval - 4 END
                IF @freq_interval >= 2 BEGIN SET @weekday = ',월' + @weekday; SET @freq_interval = @freq_interval - 2 END
                IF @freq_interval = 1 SET @weekday = @weekday + ',일'

                SET @schedule = @schedule + SUBSTRING(@weekday, 2, 30) + '요일 '
        END ELSE IF @freq_type = 16 BEGIN
                SET @schedule = CASE WHEN @freq_recurrence_factor = '1' THEN '매월 ' ELSE '매 ' + @freq_recurrence_factor + '개월마다 그달의 ' END
                SET @schedule = @schedule + CONVERT(VARCHAR(3), @freq_interval) + '일 '
        END ELSE IF @freq_type = 32 BEGIN
                SET @schedule = '매 ' + @freq_recurrence_factor + '개월마다 '

                IF @freq_relative_interval = 1 SET @schedule = @schedule + '첫 번째'
                ELSE IF @freq_relative_interval = 2 SET @schedule = @schedule + '두 번째'
                ELSE IF @freq_relative_interval = 4 SET @schedule = @schedule + '세 번째'
                ELSE IF @freq_relative_interval = 8 SET @schedule = @schedule + '네 번째'
                ELSE IF @freq_relative_interval = 16 SET @schedule = @schedule + '마지막'

                SET @schedule = @schedule + ' '

                IF @freq_interval = 1 SET @schedule = @schedule + '일요일'
                ELSE IF @freq_interval = 2 SET @schedule = @schedule + '월요일'
                ELSE IF @freq_interval = 3 SET @schedule = @schedule + '화요일'
                ELSE IF @freq_interval = 4 SET @schedule = @schedule + '수요일'
                ELSE IF @freq_interval = 5 SET @schedule = @schedule + '목요일'
                ELSE IF @freq_interval = 6 SET @schedule = @schedule + '금요일'
                ELSE IF @freq_interval = 7 SET @schedule = @schedule + '토요일'
                ELSE IF @freq_interval = 8 SET @schedule = @schedule + '일'
                ELSE IF @freq_interval = 9 SET @schedule = @schedule + '평일'
                ELSE IF @freq_interval = 10 SET @schedule = @schedule + '주말'

                SET @schedule = @schedule + ' '
        END ELSE IF @freq_type = 64 BEGIN
                SET @schedule = 'SQL Server 에이전트가 시작될 때 자동으로 시작'
        END ELSE IF @freq_type = 128 BEGIN
                SET @schedule = 'CPU가 유휴 상태로 될 때마다 시작'
        END

        IF @freq_type IN (4, 8, 16, 32) BEGIN
                IF @freq_subday_type = 1 BEGIN
                        SET @schedule = @schedule + @active_start_time + '에 발생합니다.'
                END ELSE BEGIN
                        SET @schedule = @schedule + @freq_subday_interval + ' ' + CASE @freq_subday_type WHEN 2 THEN '초' WHEN 4 THEN '분' WHEN 8 THEN '시간' END
                        SET @schedule = @schedule + '(' + @active_start_time + '에서 ' + @active_end_time + ' 사이) 간격으로 발생합니다.'
                END

                IF @active_end_date = '9999-12-31' BEGIN
                        SET @schedule = @schedule + ' 일정은 ' + @active_start_date + '부터 사용됩니다.'
                END ELSE BEGIN
                        SET @schedule = @schedule + ' 일정은 ' + @active_start_date + '에서 ' + @active_end_date + ' 사이에 사용됩니다.'
                END
        END

        RETURN @schedule
END

GO

CREATE FUNCTION DBO.FUNC_job_steps(@job_id uniqueidentifier) RETURNS VARCHAR(8000)

AS

BEGIN
        DECLARE @steps VARCHAR(8000)

        SET @steps = ''

        SELECT   @steps = CHAR(10) + '[' + CONVERT(VARCHAR(3), step_id) + ':' + step_name + ']' + CHAR(10) + command
        FROM     msdb.dbo.sysjobsteps
        WHERE    job_id = @job_id
        ORDER BY step_id

        RETURN @steps
END

GO

CREATE PROC USP_S_jobs

AS

SELECT  A.job_id
        , job_name = A.name
        , job_enabled = A.enabled
        , A.description
        , A.date_created
        , A.date_modified
        , A.version_number
        , A.start_step_id
        , steps = DBO.FUNC_job_steps(A.job_id)
        , C.schedule_id
        , C.schedule_uid
        , schedule_name = C.name
        , schedule_enabled = C.enabled
        , schedule = DBO.FUNC_job_schedule(C.schedule_id)
        , next_run_date = STUFF(STUFF(CONVERT(VARCHAR(8), B.next_run_date), 7, 0, '-'), 5, 0, '-')
        , next_run_time = STUFF(STUFF(RIGHT('000000' + CONVERT(VARCHAR(6), B.next_run_time), 6), 5, 0, ':'), 3, 0, ':')
        , C.date_created
        , C.date_modified
        , C.version_number

FROM    msdb.dbo.sysjobs A
        LEFT OUTER JOIN msdb.dbo.sysjobschedules B ON A.job_id = B.job_id
        LEFT OUTER JOIN msdb.dbo.sysschedules C ON B.schedule_id = C.schedule_id

ORDER BY A.name

GO

EXEC USP_S_jobs
다음은 실행 결과입니다.
스케줄을 한번에 볼 수 있어서 언제 실행되는 파악하기 용이합니다.

2014년 5월 8일 목요일

SP_HELPX

SP_HELPX는 SQL Server가 기본 제공하는 프로시져는 아닙니다.
제가 자주 쓰는 시스템 저장 프로시저나 명령들을 하나로 합쳐서 만들었습니다.
SP_HELPX는 하나의 파라메터를 가지고 있는데 오브젝트의 이름이나 인덱스 이름을 주면 됩니다.
오브젝트의 TYPE에 따라 각기 다른 기능을 제공합니다.

프로시저, 함수, 트리거의 경우는 소스를 보여줍니다.

체크, 디폴트, 룰의 경우는 정의한 소스와 어디에 쓰였는지를 보여줍니다.

포린키는 부모테이블 자식테이블을 보여줍니다.

테이블, 뷰의 경우는 좀 기능이 많은데
컬럼이름, 타입, 길이, NULL허용여부, IDENTITY정보, 계산된 열의 소스, 제약조건이 걸려있다면 이름과 소스를 보여줍니다.
그리고 인덱스가 있으면 인덱스 정보를 보여줍니다.
SP_HELPINDEX는 포함된 열은 표시를 안해주는데 포함된 열도 표시해줍니다.
그리고 INDEX에 포함된 데이터 건수도 보여줍니다. 필터인덱스의 경우 유용합니다.
인덱스의 조각화 정보도 보여주는데 테이블이 클 경우 너무 느립니다.
그래서 똑같은 소스로 SP_HELPZ를 만들고 SP_HELPZ를 실행할때만 보여주도록 했습니다.
테이블에 포린키가 걸려있다면 부모테이블이나 자식테이블을 보여줍니다.
트리거가 있다면 트리거 이름을 보여줍니다.
마지막으로 테이블의 데이터 100건을 보여줍니다.
추가로 뷰의 경우는 소스를 보여줍니다.

테이블을 반환하는 펑션의 경우는 소스와 반환하는 테이블의 구조를 보여줍니다.

인덱스는 통계정보와 인덱스가 속한 테이블의 정보를 보여줍니다.

파라메터에 컬럼 이름이 오면 어떤 그 컬럼 이름을 사용하는 테이블 리스트를 보여주니다.

타입의 경우엔 어느 컬럼에 사용되었는지 보여줍니다.

파라메터에 #검색어# 이런식으로 주면 오브젝트, 컬럼, 인덱스, 사용자정의 타입 들을 검색해서 보여줍니다.

파라메터에 빈 문자열을 주면 자주 쓰는 명령어나 프로시저를 프린트 하도록 했습니다.

SP_HELPX를 단축키로 등록해놓으면 아주아주아주 좋습니다.
방법은 SSMS의 도구>>옵션>>환경>>키보드>>쿼리 바로 가기에 등록해두면 됩니다.

다음은 SP_HELPX의 소스입니다.
USE master

GO

IF OBJECT_ID('dbo.SP_HELPX', 'P') IS NULL
BEGIN
	EXEC ('CREATE PROCEDURE dbo.SP_HELPX AS SELECT TODAY = GETDATE()')
	GRANT EXECUTE ON master.dbo.SP_HELPX TO [PUBLIC]
END

GO

ALTER PROC SP_HELPX

@OBJECT SYSNAME = ''
, @OPTION NVARCHAR(128) = ''
, @DEBUG INT = 0

AS

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
SET NOCOUNT ON

IF @OBJECT = ''
BEGIN
	PRINT '/* SP_HELPX 21.1110.002 */'
	PRINT '/* Written By chozzahacker */'
	PRINT '/*     https://chozzahacker.blogspot.kr */'
	PRINT '/*     chozzahacker@gmail.com */'
	PRINT ''
	PRINT '/* Date And Time Statements */'
	PRINT 'SET DATEFIRST'
	PRINT 'SET DATEFORMAT'
	PRINT ''
	PRINT '/* Locking Statements */'
	PRINT 'SET DEADLOCK_PRIORITY'
	PRINT 'SET LOCK_TIMEOUT'
	PRINT ''
	PRINT '/* Miscellaneous Statements */'
	PRINT 'SET CONCAT_NULL_YIELDS_NULL'
	PRINT 'SET CURSOR_CLOSE_ON_COMMIT'
	PRINT 'SET FIPS_FLAGGER'
	PRINT 'SET IDENTITY_INSERT'
	PRINT 'SET LANGUAGE'
	PRINT 'SET OFFSETS'
	PRINT 'SET QUOTED_IDENTIFIER'
	PRINT ''
	PRINT '/* Query Execution Statements */'
	PRINT 'SET ARITHABORT'
	PRINT 'SET ARITHIGNORE'
	PRINT 'SET FMTONLY'
	PRINT 'SET NOCOUNT'
	PRINT 'SET NOEXEC'
	PRINT 'SET NUMERIC_ROUNDABORT'
	PRINT 'SET PARSEONLY'
	PRINT 'SET QUERY_GOVERNOR_COST_LIMIT'
	PRINT 'SET ROWCOUNT'
	PRINT 'SET TEXTSIZE'
	PRINT ''
	PRINT '/* ISO Settings Statements */'
	PRINT 'SET ANSI_DEFAULTS'
	PRINT 'SET ANSI_NULL_DFLT_OFF'
	PRINT 'SET ANSI_NULL_DFLT_ON'
	PRINT 'SET ANSI_NULLS'
	PRINT 'SET ANSI_PADDING'
	PRINT 'SET ANSI_WARNINGS'
	PRINT ''
	PRINT '/* Statistics Statements */'
	PRINT 'SET FORCEPLAN'
	PRINT 'SET SHOWPLAN_ALL'
	PRINT 'SET SHOWPLAN_TEXT'
	PRINT 'SET SHOWPLAN_XML'
	PRINT 'SET STATISTICS IO'
	PRINT 'SET STATISTICS XML'
	PRINT 'SET STATISTICS PROFILE'
	PRINT 'SET STATISTICS TIME'
	PRINT ''
	PRINT '/* Transactions Statements */'
	PRINT 'SET IMPLICIT_TRANSACTIONS'
	PRINT 'SET REMOTE_PROC_TRANSACTIONS'
	PRINT 'SET TRANSACTION ISOLATION LEVEL'
	PRINT 'SET XACT_ABORT'
	PRINT ''
	PRINT '/* Informational Statements */'
	PRINT 'DBCC INPUTBUFFER'
	PRINT 'DBCC SHOWCONTIG'
	PRINT 'DBCC OPENTRAN'
	PRINT 'DBCC SQLPERF'
	PRINT 'DBCC OUTPUTBUFFER'
	PRINT 'DBCC TRACESTATUS'
	PRINT 'DBCC PROCCACHE'
	PRINT 'DBCC USEROPTIONS'
	PRINT 'DBCC SHOW_STATISTICS'
	PRINT 'DBCC MEMORYSTATUS'
	PRINT ''
	PRINT '/* Validation Statements */'
	PRINT 'DBCC CHECKALLOC'
	PRINT 'DBCC CHECKFILEGROUP'
	PRINT 'DBCC CHECKCATALOG'
	PRINT 'DBCC CHECKIDENT'
	PRINT 'DBCC CHECKCONSTRAINTS'
	PRINT 'DBCC CHECKTABLE'
	PRINT 'DBCC CHECKDB'
	PRINT ''
	PRINT '/* Maintenance Statements */'
	PRINT 'DBCC CLEANTABLE'
	PRINT 'DBCC INDEXDEFRAG'
	PRINT 'DBCC DBREINDEX'
	PRINT 'DBCC SHRINKDATABASE'
	PRINT 'DBCC DROPCLEANBUFFERS'
	PRINT 'DBCC SHRINKFILE'
	PRINT 'DBCC FREEPROCCACHE'
	PRINT 'DBCC UPDATEUSAGE'
	PRINT ''
	PRINT '/* Miscellaneous Statements */'
	PRINT 'DBCC dllname (FREE)'
	PRINT 'DBCC HELP'
	PRINT 'DBCC FLUSHAUTHCACHE'
	PRINT 'DBCC TRACEOFF'
	PRINT 'DBCC FREESESSIONCACHE'
	PRINT 'DBCC TRACEON'
	PRINT 'DBCC FREESYSTEMCACHE'
	PRINT 'DBCC CLONEDATABASE'

	RETURN
END

DECLARE @SCRIPT NVARCHAR(MAX)

IF @OBJECT LIKE '%$%'
BEGIN
	SET @SCRIPT = N' /* Retrive Procedure Definition */ '

	IF @OBJECT LIKE '%$$%'
	BEGIN
		SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' USE [?]; '
		SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10)
	END

	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' IF EXISTS (SELECT 1 FROM SYS.OBJECTS A INNER JOIN SYS.SQL_MODULES B ON A.OBJECT_ID = B.OBJECT_ID WHERE B.DEFINITION LIKE ''' + REPLACE(@OBJECT, '$', '%') + ''') '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' BEGIN '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '     SELECT [Catalog View] = ''sys.sql_modules'' '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '            , [Type] = A.TYPE_DESC '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '            , [Database] = DB_NAME() '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '            , [Schema] = SCHEMA_NAME(A.SCHEMA_ID) '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '            , [Name] = A.NAME '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '     FROM   SYS.OBJECTS A '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '            INNER JOIN SYS.SQL_MODULES B ON A.OBJECT_ID = B.OBJECT_ID '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '     WHERE  B.DEFINITION LIKE ''' + REPLACE(@OBJECT, '$', '%') + ''' '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '     ORDER BY 1, 2, 3, 4 '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' END '

	IF @DEBUG = 1
	BEGIN
		PRINT @SCRIPT
	END
	ELSE
	BEGIN
		IF @OBJECT LIKE '%$$%'
		BEGIN
			EXEC sp_MSforeachdb @SCRIPT
		END
		ELSE
		BEGIN
			EXEC (@SCRIPT)
		END
	END

	RETURN
END

IF @OBJECT LIKE '%#%'
BEGIN
	SET @SCRIPT = N' /* Search for Objects */ '

	IF @OBJECT LIKE '%##%'
	BEGIN
		SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' USE [?]; '
		SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10)
	END

	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' IF EXISTS (SELECT 1 FROM SYS.OBJECTS WHERE NAME LIKE ''' + REPLACE(@OBJECT, '#', '%') + ''') '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' BEGIN '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '     SELECT [Catalog View] = ''sys.objects'' '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '            , [Type] = A.TYPE_DESC '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '            , [Database] = DB_NAME() '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '            , [Schema] = SCHEMA_NAME(A.SCHEMA_ID) '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '            , [Name] = A.NAME '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '            , [Description] = ''['' + B.NAME + ''] '' + CAST(B.VALUE AS NVARCHAR(4000)) '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '     FROM   SYS.OBJECTS A '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '            LEFT OUTER JOIN SYS.EXTENDED_PROPERTIES B ON A.OBJECT_ID = B.MAJOR_ID AND B.MINOR_ID = 0 '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '     WHERE  A.NAME LIKE ''' + REPLACE(@OBJECT, '#', '%') + ''' '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '     ORDER BY 1, 2, 3, 4 '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' END '

	IF @DEBUG = 1
	BEGIN
		PRINT ''
		PRINT @SCRIPT
	END
	ELSE
	BEGIN
		IF @OBJECT LIKE '%##%'
		BEGIN
			EXEC sp_MSforeachdb @SCRIPT
		END
		ELSE
		BEGIN
			EXEC (@SCRIPT)
		END
	END

	SET @SCRIPT = N' /* Search for Columns */ '

	IF @OBJECT LIKE '%##%'
	BEGIN
		SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' USE [?]; '
		SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10)
	END

	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' IF EXISTS (SELECT 1 FROM SYS.COLUMNS WHERE NAME LIKE ''' + REPLACE(@OBJECT, '#', '%') + ''') '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' BEGIN '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '     SELECT [Catalog View] = ''sys.columns'' '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '            , [Type] = A.TYPE_DESC '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '            , [Database] = DB_NAME() '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '            , [Schema] = SCHEMA_NAME(A.SCHEMA_ID) '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '            , [Name] = A.NAME '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '            , [Column] = B.NAME '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '            , Collation = B.collation_name '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '            , [Description] = ''['' + C.NAME + ''] '' + CAST(C.VALUE AS NVARCHAR(4000)) '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '     FROM   SYS.OBJECTS A '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '            INNER JOIN SYS.COLUMNS B ON A.OBJECT_ID = B.OBJECT_ID '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '            LEFT OUTER JOIN SYS.EXTENDED_PROPERTIES C ON B.OBJECT_ID = C.MAJOR_ID AND B.COLUMN_ID = C.MINOR_ID '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '     WHERE  B.NAME LIKE ''' + REPLACE(@OBJECT, '#', '%') + ''' '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '     ORDER BY 1, 2, 3, 4, 5 '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' END '

	IF @DEBUG = 1
	BEGIN
		PRINT ''
		PRINT @SCRIPT
	END
	ELSE
	BEGIN
		IF @OBJECT LIKE '%##%'
		BEGIN
			EXEC sp_MSforeachdb @SCRIPT
		END
		ELSE
		BEGIN
			EXEC (@SCRIPT)
		END
	END

	SET @SCRIPT = N' /* Search for Indexes */ '

	IF @OBJECT LIKE '%##%'
	BEGIN
		SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' USE [?]; '
		SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10)
	END

	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' IF EXISTS (SELECT 1 FROM SYS.INDEXES WHERE NAME LIKE ''' + REPLACE(@OBJECT, '#', '%') + ''') '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' BEGIN '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '     SELECT [Catalog View] = ''sys.indexes'' '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '            , [Type] = A.TYPE_DESC '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '            , [Database] = DB_NAME() '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '            , [Schema] = SCHEMA_NAME(A.SCHEMA_ID) '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '            , [Name] = A.NAME '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '            , [Index] = B.NAME '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '     FROM   SYS.OBJECTS A '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '            INNER JOIN SYS.INDEXES B ON A.OBJECT_ID = B.OBJECT_ID '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '     WHERE  B.NAME LIKE ''' + REPLACE(@OBJECT, '#', '%') + ''' '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '     ORDER BY 1, 2, 3, 4, 5 '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' END '

	IF @DEBUG = 1
	BEGIN
		PRINT ''
		PRINT @SCRIPT
	END
	ELSE
	BEGIN
		IF @OBJECT LIKE '%##%'
		BEGIN
			EXEC sp_MSforeachdb @SCRIPT
		END
		ELSE
		BEGIN
			EXEC (@SCRIPT)
		END
	END

	SET @SCRIPT = N' /* Search for Types */ '

	IF @OBJECT LIKE '%##%'
	BEGIN
		SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' USE [?]; '
		SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10)
	END

	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' IF EXISTS (SELECT 1 FROM SYS.TYPES WHERE NAME LIKE ''' + REPLACE(@OBJECT, '#', '%') + ''') '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' BEGIN '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '     SELECT [Catalog View] = ''sys.types'' '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '            , [Database] = DB_NAME() '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '            , [Schema] = SCHEMA_NAME(SCHEMA_ID) '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '            , [Name] = NAME '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '     FROM   SYS.TYPES A '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '     WHERE  NAME LIKE ''' + REPLACE(@OBJECT, '#', '%') + ''' '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '     ORDER BY 1, 2, 3, 4 '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' END '

	IF @DEBUG = 1
	BEGIN
		PRINT ''
		PRINT @SCRIPT
	END
	ELSE
	BEGIN
		IF @OBJECT LIKE '%##%'
		BEGIN
			EXEC sp_MSforeachdb @SCRIPT
		END
		ELSE
		BEGIN
			EXEC (@SCRIPT)
		END
	END

	SET @SCRIPT = N' /* Search for Table Types */ '

	IF @OBJECT LIKE '%##%'
	BEGIN
		SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' USE [?]; '
		SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10)
	END

	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' IF EXISTS (SELECT 1 FROM SYS.TYPES WHERE NAME LIKE ''' + REPLACE(@OBJECT, '#', '%') + ''') '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' BEGIN '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '     SELECT [Catalog View] = ''sys.table_types'' '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '            , [Database] = DB_NAME() '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '            , [Schema] = SCHEMA_NAME(SCHEMA_ID) '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '            , [Name] = NAME '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '     FROM   SYS.TABLE_TYPES A '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '     WHERE  NAME LIKE ''' + REPLACE(@OBJECT, '#', '%') + ''' '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '     ORDER BY 1, 2, 3, 4 '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' END '

	IF @DEBUG = 1
	BEGIN
		PRINT ''
		PRINT @SCRIPT
	END
	ELSE
	BEGIN
		IF @OBJECT LIKE '%##%'
		BEGIN
			EXEC sp_MSforeachdb @SCRIPT
		END
		ELSE
		BEGIN
			EXEC (@SCRIPT)
		END
	END

	SET @SCRIPT = N' /* Search for EXTENDED_PROPERTIES */ '

	IF @OBJECT LIKE '%##%'
	BEGIN
		SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' USE [?]; '
		SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10)
	END

	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' IF EXISTS (SELECT 1 FROM SYS.EXTENDED_PROPERTIES WHERE CLASS IN (1, 2, 7) AND (CAST(NAME AS NVARCHAR(4000)) LIKE ''' + REPLACE(@OBJECT, '#', '%') + ''' OR CAST(VALUE AS NVARCHAR(4000)) LIKE ''' + REPLACE(@OBJECT, '#', '%') + ''')) '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' BEGIN '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '     SELECT DISTINCT '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '            [Catalog View] = ''sys.extended_properties'' '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '            , [Class] = A.CLASS_DESC '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '            , [Database] = DB_NAME() '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '            , [Schema] = SCHEMA_NAME(B.SCHEMA_ID) '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '            , [Object Type] = B.TYPE_DESC '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '            , [Major] = B.NAME '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '            , [Minor] = COALESCE(C.NAME, D.NAME) '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '            , [Name] = A.NAME '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '            , [Description] = A.VALUE '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '     FROM   SYS.EXTENDED_PROPERTIES A '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '            INNER JOIN SYS.OBJECTS B ON A.MAJOR_ID = B.OBJECT_ID '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '            LEFT OUTER JOIN SYS.COLUMNS C ON B.OBJECT_ID = C.OBJECT_ID AND A.MINOR_ID = C.COLUMN_ID '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '            LEFT OUTER JOIN SYS.INDEXES D ON B.OBJECT_ID = D.OBJECT_ID AND A.MINOR_ID = D.INDEX_ID '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '     WHERE  A.CLASS IN (1, 2, 7) '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '            AND (CAST(A.NAME AS NVARCHAR(4000)) LIKE ''' + REPLACE(@OBJECT, '#', '%') + ''' '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '                 OR CAST(A.VALUE AS NVARCHAR(4000)) LIKE ''' + REPLACE(@OBJECT, '#', '%') + ''') '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '     ORDER BY 1, 2, 3, 4, 5, 6, 7, 8 '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' END '

	IF @DEBUG = 1
	BEGIN
		PRINT ''
		PRINT @SCRIPT
	END
	ELSE
	BEGIN
		IF @OBJECT LIKE '%##%'
		BEGIN
			EXEC sp_MSforeachdb @SCRIPT
		END
		ELSE
		BEGIN
			EXEC (@SCRIPT)
		END
	END

	RETURN
END

DECLARE @ProductVersion INT
DECLARE @DATABASE SYSNAME
DECLARE @SCHEMA SYSNAME

SET @ProductVersion = CONVERT(INT, REPLACE(LEFT(CONVERT(VARCHAR(128), SERVERPROPERTY('ProductVersion')), 2), '.', ''))
SET @DATABASE = ISNULL(PARSENAME(@OBJECT, 3), DB_NAME())
SET @SCHEMA = PARSENAME(@OBJECT, 2)
SET @OBJECT = PARSENAME(@OBJECT, 1)

DECLARE @HELPTEXT SYSNAME

SET @HELPTEXT = (SELECT TOP 1 NAME + ' ' FROM master.SYS.OBJECTS WHERE NAME = 'SP_HELPTEXTX' AND IS_MS_SHIPPED = 1)
IF @HELPTEXT IS NULL SET @HELPTEXT = (SELECT TOP 1 NAME + ' ' FROM master.SYS.OBJECTS WHERE NAME LIKE 'SP_HELPTEXT%' AND IS_MS_SHIPPED = 1)
IF @HELPTEXT IS NULL SET @HELPTEXT = 'SP_HELPTEXT'

SET @SCRIPT = ' USE [' + @DATABASE + ']; '
SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10)
SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' SELECT @TYPE = RTRIM(LTRIM(A.TYPE)) '
SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , @TYPE_DESC = A.TYPE_DESC '

IF @SCHEMA IS NULL
BEGIN
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , @SCHEMA = B.NAME '
END

SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' FROM   SYS.OBJECTS A '
SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        INNER JOIN SYS.SCHEMAS B ON A.SCHEMA_ID = B.SCHEMA_ID '
SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' WHERE  A.NAME = ''' + @OBJECT + ''' '

IF @SCHEMA IS NOT NULL
BEGIN
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        AND B.NAME = ''' + @SCHEMA + ''' '
END

DECLARE @TYPE VARCHAR(2), @TYPE_DESC NVARCHAR(60)

IF @SCHEMA IS NULL
BEGIN
	EXEC SP_EXECUTESQL @SCRIPT, N'@TYPE VARCHAR(2) OUTPUT, @TYPE_DESC NVARCHAR(60) OUTPUT, @SCHEMA SYSNAME OUTPUT', @TYPE = @TYPE OUTPUT, @TYPE_DESC = @TYPE_DESC OUTPUT, @SCHEMA = @SCHEMA OUTPUT
END
ELSE
BEGIN
	EXEC SP_EXECUTESQL @SCRIPT, N'@TYPE VARCHAR(2) OUTPUT, @TYPE_DESC NVARCHAR(60) OUTPUT', @TYPE = @TYPE OUTPUT, @TYPE_DESC = @TYPE_DESC OUTPUT
END

IF @TYPE = 'C'
BEGIN
	SET @SCRIPT = N' /* TYPE : ' + @TYPE + ', ' + @TYPE_DESC + ' */ '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' USE [' + @DATABASE + ']; '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10)
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' SELECT [Type] = A.TYPE_DESC '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , [Schema] = SCHEMA_NAME(B.SCHEMA_ID) '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , [Name] = A.NAME '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , [Table] = B.NAME '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , [Column] = C.NAME '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , [Definition] = CAST(A.DEFINITION AS NVARCHAR(4000)) '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , [Description] = ''['' + D.NAME + ''] '' + ISNULL(CAST(D.VALUE AS NVARCHAR(4000)), '''') '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' FROM   SYS.CHECK_CONSTRAINTS A '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        INNER JOIN SYS.OBJECTS B ON A.PARENT_OBJECT_ID = B.OBJECT_ID '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        LEFT OUTER JOIN SYS.COLUMNS C ON B.OBJECT_ID = C.OBJECT_ID AND A.PARENT_COLUMN_ID = C.COLUMN_ID '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        LEFT OUTER JOIN SYS.EXTENDED_PROPERTIES D ON A.OBJECT_ID = D.MAJOR_ID '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' WHERE  A.NAME = ''' + @OBJECT + ''' '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        AND B.SCHEMA_ID = SCHEMA_ID(''' + @SCHEMA + ''') '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' ORDER BY 2, 3, 4, 5'

	IF @DEBUG = 1
	BEGIN
		PRINT @SCRIPT
	END
	ELSE
	BEGIN
		EXEC (@SCRIPT)
	END
END
ELSE IF @TYPE IN ('P', 'FN', 'TR', 'IF')
BEGIN
	SET @SCRIPT = N' /* TYPE : ' + @TYPE + ', ' + @TYPE_DESC + ' */ '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' USE [' + @DATABASE + ']; '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10)
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' EXEC ' + @HELPTEXT + ' ''[' + @SCHEMA + '].[' + @OBJECT + ']'' '

	IF @DEBUG = 1
	BEGIN
		PRINT @SCRIPT
	END
	ELSE
	BEGIN
		EXEC (@SCRIPT)
	END
END
ELSE IF @TYPE = 'IT'
BEGIN
	SET @SCRIPT = N' /* TYPE : ' + @TYPE + ', ' + @TYPE_DESC + ' */ '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' USE [' + @DATABASE + ']; '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10)
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' EXEC SP_HELP ''[' + @SCHEMA + '].[' + @OBJECT + ']'' '

	IF @DEBUG = 1
	BEGIN
		PRINT @SCRIPT
	END
	ELSE
	BEGIN
		EXEC (@SCRIPT)
	END
END
ELSE IF @TYPE = 'TF'
BEGIN
	SET @SCRIPT = N' /* TYPE : ' + @TYPE + ', ' + @TYPE_DESC + ' */ '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' USE [' + @DATABASE + ']; '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10)
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' EXEC ' + @HELPTEXT + ' ''[' + @SCHEMA + '].[' + @OBJECT + ']'' '

	IF @DEBUG = 1
	BEGIN
		PRINT @SCRIPT
	END
	ELSE
	BEGIN
		EXEC (@SCRIPT)
	END

	SET @SCRIPT = N' USE [' + @DATABASE + ']; '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10)
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' SELECT [Type] = A.TYPE_DESC '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , [Schema] = SCHEMA_NAME(A.SCHEMA_ID) '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , [Name] = A.NAME '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , [Column] = B.NAME '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , [User Type] = C.NAME '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , [System Type] = D.NAME '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , [Max Length] = B.MAX_LENGTH '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , B.Precision '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , B.Scale '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , Nullable = CASE WHEN B.IS_NULLABLE = ''0'' THEN ''NOT NULL'' ELSE '''' END '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' FROM   SYS.OBJECTS A '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        INNER JOIN SYS.COLUMNS B ON A.OBJECT_ID = B.OBJECT_ID '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        INNER JOIN SYS.TYPES C ON B.USER_TYPE_ID = C.USER_TYPE_ID '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        INNER JOIN SYS.TYPES D ON B.SYSTEM_TYPE_ID = D.SYSTEM_TYPE_ID AND B.SYSTEM_TYPE_ID = D.USER_TYPE_ID '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' WHERE  A.NAME = ''' + @OBJECT + ''' '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        AND A.SCHEMA_ID = SCHEMA_ID(''' + @SCHEMA + ''') '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' ORDER BY 2, 3, 4 '

	IF @DEBUG = 1
	BEGIN
		PRINT @SCRIPT
	END
	ELSE
	BEGIN
		EXEC (@SCRIPT)
	END
END
ELSE IF @TYPE = 'D'
BEGIN
	SET @SCRIPT = N' /* TYPE : ' + @TYPE + ', ' + @TYPE_DESC + ' */ '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' USE [' + @DATABASE + ']; '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10)
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' SELECT [Type] = C.TYPE_DESC '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , [Schema] = SCHEMA_NAME(A.SCHEMA_ID) '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , [Name] = C.NAME '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , [Table] = A.NAME '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , [Column] = B.NAME '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , [Definition] = CAST(ISNULL(D.DEFINITION, E.DEFINITION) AS NVARCHAR(4000)) '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' FROM   SYS.OBJECTS A '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        INNER JOIN SYS.COLUMNS B ON A.OBJECT_ID = B.OBJECT_ID '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        INNER JOIN SYS.OBJECTS C ON B.DEFAULT_OBJECT_ID = C.OBJECT_ID '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        LEFT OUTER JOIN SYS.DEFAULT_CONSTRAINTS D ON B.DEFAULT_OBJECT_ID = D.OBJECT_ID '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        LEFT OUTER JOIN SYS.SQL_MODULES E ON B.DEFAULT_OBJECT_ID = E.OBJECT_ID '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' WHERE  C.NAME = ''' + @OBJECT + ''' '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        AND C.SCHEMA_ID = SCHEMA_ID(''' + @SCHEMA + ''') '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' ORDER BY 2, 3, 4, 5 '

	IF @DEBUG = 1
	BEGIN
		PRINT @SCRIPT
	END
	ELSE
	BEGIN
		EXEC (@SCRIPT)
	END
END
ELSE IF @TYPE = 'R'
BEGIN
	SET @SCRIPT = N' /* TYPE : ' + @TYPE + ', ' + @TYPE_DESC + ' */ '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' USE [' + @DATABASE + ']; '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10)
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' SELECT [Type] = C.TYPE_DESC '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , [Schema] = SCHEMA_NAME(A.SCHEMA_ID) '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , [Name] = C.NAME '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , [Table] = A.NAME '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , [Column] = B.NAME '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , [Definition] = CAST(D.DEFINITION AS NVARCHAR(4000)) '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' FROM   SYS.OBJECTS A '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        INNER JOIN SYS.COLUMNS B ON A.OBJECT_ID = B.OBJECT_ID '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        INNER JOIN SYS.OBJECTS C ON B.RULE_OBJECT_ID = C.OBJECT_ID '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        INNER JOIN SYS.SQL_MODULES D ON C.OBJECT_ID = D.OBJECT_ID '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' WHERE  C.NAME = ''' + @OBJECT + ''' '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        AND C.SCHEMA_ID = SCHEMA_ID(''' + @SCHEMA + ''') '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' ORDER BY 2, 3, 4, 5 '

	IF @DEBUG = 1
	BEGIN
		PRINT @SCRIPT
	END
	ELSE
	BEGIN
		EXEC (@SCRIPT)
	END
END
ELSE IF @TYPE = 'F'
BEGIN
	SET @SCRIPT = N' /* TYPE : ' + @TYPE + ', ' + @TYPE_DESC + ' */ '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' USE [' + @DATABASE + ']; '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10)
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' IF OBJECT_ID(''tempdb..#Foreign'', N''U'') IS NOT NULL DROP TABLE #Foreign '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10)
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' SELECT [Type] = B.TYPE_DESC '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , B.Name '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , [Schema] = SCHEMA_NAME(C.SCHEMA_ID) '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , [Table] = C.NAME '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , [Column] = D.NAME '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , [Reference Schema] = SCHEMA_NAME(E.SCHEMA_ID) '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , [Reference Table] = E.NAME '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , [Reference Column] = F.NAME INTO #Foreign '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' FROM   SYS.FOREIGN_KEY_COLUMNS A '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        INNER JOIN SYS.OBJECTS B ON A.CONSTRAINT_OBJECT_ID = B.OBJECT_ID '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        INNER JOIN SYS.OBJECTS C ON A.PARENT_OBJECT_ID = C.OBJECT_ID '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        INNER JOIN SYS.COLUMNS D ON C.OBJECT_ID = D.OBJECT_ID AND A.PARENT_COLUMN_ID = D.COLUMN_ID '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        INNER JOIN SYS.OBJECTS E ON A.REFERENCED_OBJECT_ID = E.OBJECT_ID '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        INNER JOIN SYS.COLUMNS F ON E.OBJECT_ID = F.OBJECT_ID AND A.REFERENCED_COLUMN_ID = F.COLUMN_ID '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' WHERE  B.NAME = ''' + @OBJECT + ''' '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        AND B.SCHEMA_ID = SCHEMA_ID(''' + @SCHEMA + ''') '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10)
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' SELECT DISTINCT '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        [Type] '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , Name '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , [Schema] '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , [Table] '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , [Column] = STUFF((SELECT '', '' + [Column] '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '                            FROM   #Foreign B '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '                            WHERE  A.Name = B.Name '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '                            FOR XML PATH('''')), 1, 2, '''') '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , [Reference Schema] '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , [Reference Table] '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , [Reference Column] = STUFF((SELECT '', '' + [Reference Column] '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '                                      FROM   #Foreign B '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '                                      WHERE  A.Name = B.Name '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '                                      FOR XML PATH('''')), 1, 2, '''') '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' FROM   #Foreign A '

	IF @DEBUG = 1
	BEGIN
		PRINT @SCRIPT
	END
	ELSE
	BEGIN
		EXEC (@SCRIPT)
	END
END
ELSE IF @TYPE IN ('U', 'V')
BEGIN
	DECLARE @SCRIPT1 NVARCHAR(MAX); SET @SCRIPT1 = ''
	DECLARE @SCRIPT2 NVARCHAR(MAX); SET @SCRIPT2 = ''
	DECLARE @SCRIPT3 NVARCHAR(MAX); SET @SCRIPT3 = ''

	IF @TYPE = 'V'
	BEGIN
		SET @SCRIPT = N' /* TYPE : ' + @TYPE + ', ' + @TYPE_DESC + ' */ '
		SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' USE [' + @DATABASE + ']; '
		SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10)
		SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' EXEC ' + @HELPTEXT + ' ''[' + @SCHEMA + '].[' + @OBJECT + ']'' '

		IF @DEBUG = 1
		BEGIN
			PRINT @SCRIPT
		END
		ELSE
		BEGIN
			EXEC (@SCRIPT)
		END
	END

	SET @SCRIPT1 = N' /* TYPE : ' + @TYPE + ', ' + @TYPE_DESC + ' */ '
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10) + ' USE [' + @DATABASE + ']; '
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10)
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10) + ' IF EXISTS (SELECT * FROM SYS.EXTENDED_PROPERTIES WHERE MAJOR_ID = OBJECT_ID(''' + @OBJECT + ''') AND MINOR_ID = 0) '
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10) + ' BEGIN '
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10) + '     SELECT [Type] = A.TYPE_DESC '
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10) + '            , [Schema] = SCHEMA_NAME(A.SCHEMA_ID) '
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10) + '            , A.Name '
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10) + '            , Property = B.Name '
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10) + '            , B.Value '
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10) + '     FROM   SYS.OBJECTS A '
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10) + '            INNER JOIN SYS.EXTENDED_PROPERTIES B ON A.OBJECT_ID = B.MAJOR_ID AND B.MINOR_ID = 0 '
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10) + '     WHERE  A.NAME = ''' + @OBJECT + ''' '
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10) + ' END '
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10)
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10) + ' IF OBJECT_ID(''tempdb..#Table'', N''U'') IS NOT NULL DROP TABLE #Table '
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10)
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10) + ' SELECT  [Type] = A.TYPE_DESC '
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10) + '        , [Schema] = SCHEMA_NAME(A.SCHEMA_ID) '
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10) + '        , A.NAME '
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10) + '        , [Column] = B.NAME '
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10) + '        , [Description] = ''['' + L.NAME + ''] '' + CAST(L.VALUE AS NVARCHAR(4000)) '
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10) + '        , [User Type] = C.NAME '
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10) + '        , [System Type] = D.NAME '
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10) + '        , B.MAX_LENGTH '
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10) + '        , B.Precision '
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10) + '        , B.Scale '
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10) + '        , [Identity] = ISNULL(''('' + CAST(E.SEED_VALUE AS VARCHAR(10)) + '','' + CAST(E.INCREMENT_VALUE AS VARCHAR(10)) + '')'', '''') '
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10) + '        , Nullable = CASE WHEN B.IS_NULLABLE = ''0'' THEN ''NOT NULL'' ELSE '''' END '
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10) + '        , Collation = B.collation_name '
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10) + '        , [Computed] = ISNULL(CAST(F.Definition AS NVARCHAR(4000)), '''') '
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10) + '        , [Persisted] = CASE WHEN F.IS_PERSISTED = 1 THEN ''Y'' ELSE '''' END '
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10) + '        , [Default] = ISNULL(ISNULL(G.NAME + '' AS '' + CAST(G.Definition AS NVARCHAR(4000)), CAST(H.Definition AS NVARCHAR(4000))), '''') '
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10) + '        , [Check] = ISNULL(J.Name + '' AS '' + CAST(J.Definition AS NVARCHAR(4000)), '''') '
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10) + '        , [Rule] = ISNULL(CAST(K.Definition AS NVARCHAR(4000)), '''') '
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10) + '        , B.COLUMN_ID INTO #Table '
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10) + ' FROM   SYS.OBJECTS A '
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10) + '        INNER JOIN SYS.COLUMNS B ON A.OBJECT_ID = B.OBJECT_ID '
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10) + '        INNER JOIN SYS.TYPES C ON B.USER_TYPE_ID = C.USER_TYPE_ID '
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10) + '        INNER JOIN SYS.TYPES D ON B.SYSTEM_TYPE_ID = D.SYSTEM_TYPE_ID AND B.SYSTEM_TYPE_ID = D.USER_TYPE_ID '
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10) + '        LEFT OUTER JOIN SYS.IDENTITY_COLUMNS E ON B.OBJECT_ID = E.OBJECT_ID AND B.COLUMN_ID = E.COLUMN_ID '
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10) + '        LEFT OUTER JOIN SYS.COMPUTED_COLUMNS F ON B.OBJECT_ID = F.OBJECT_ID AND B.COLUMN_ID = F.COLUMN_ID '
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10) + '        LEFT OUTER JOIN SYS.DEFAULT_CONSTRAINTS G ON B.DEFAULT_OBJECT_ID = G.OBJECT_ID AND B.COLUMN_ID = G.PARENT_COLUMN_ID '
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10) + '        LEFT OUTER JOIN SYS.SQL_MODULES H ON B.DEFAULT_OBJECT_ID = H.OBJECT_ID '
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10) + '        LEFT OUTER JOIN SYS.CHECK_CONSTRAINTS J ON B.OBJECT_ID = J.PARENT_OBJECT_ID AND B.COLUMN_ID = J.PARENT_COLUMN_ID '
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10) + '        LEFT OUTER JOIN SYS.SQL_MODULES K ON B.RULE_OBJECT_ID = K.OBJECT_ID '
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10) + '        LEFT OUTER JOIN SYS.EXTENDED_PROPERTIES L ON B.OBJECT_ID = L.MAJOR_ID AND B.COLUMN_ID = L.MINOR_ID '
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10) + ' WHERE  A.NAME = ''' + @OBJECT + ''' '
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10) + '        AND A.SCHEMA_ID = SCHEMA_ID(''' + @SCHEMA + ''') '
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10)
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10) + ' SELECT [Type] '
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10) + '        , [Schema] '
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10) + '        , [Name] '
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10) + '        , [Column] '
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10) + '        , [Description] '
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10) + '        , [User Type] '
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10) + '        , [System Type] '
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10) + '        , [Max Length] = MAX_LENGTH '
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10) + '        , Precision '
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10) + '        , Scale '
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10) + '        , [Identity] '
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10) + '        , Nullable '
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10) + '        , Collation '
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10) + '        , [Computed] '
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10) + '        , [Persisted] '
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10) + '        , [Default] '
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10) + '        , [Check] '
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10) + '        , [Rule] '
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10) + ' FROM   #Table '
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10) + ' ORDER BY COLUMN_ID '
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10)
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10) + ' IF EXISTS (SELECT * FROM SYS.CHECK_CONSTRAINTS A INNER JOIN SYS.OBJECTS B ON A.PARENT_OBJECT_ID = B.OBJECT_ID WHERE A.PARENT_COLUMN_ID = 0 AND B.NAME = ''' + @OBJECT + ''' AND B.SCHEMA_ID = SCHEMA_ID(''' + @SCHEMA + ''')) '
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10) + ' BEGIN '
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10) + '     SELECT [Check Constraint Name] = A.NAME '
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10) + '            , [Definition] = A.DEFINITION '
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10) + '     FROM   SYS.CHECK_CONSTRAINTS A '
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10) + '            INNER JOIN SYS.OBJECTS B ON A.PARENT_OBJECT_ID = B.OBJECT_ID '
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10) + '     WHERE  A.PARENT_COLUMN_ID = 0 '
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10) + '            AND B.NAME = ''' + @OBJECT + ''' '
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10) + '            AND B.SCHEMA_ID = SCHEMA_ID(''' + @SCHEMA + ''') '
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10) + ' END '

	IF @TYPE = 'U'
	BEGIN
		SET @SCRIPT2 = ' DECLARE @COL1 NVARCHAR(MAX); '
		SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10)
		SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + ' SET @COL1 = N'''' '
		SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10)
		SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + ' SELECT @COL1 = @COL1 + ''    , '' + [Column] + '' '' + '
		SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '        CASE WHEN [COMPUTED] <> '''' THEN ''AS '' + [COMPUTED] '
		SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '        ELSE '
		SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '            UPPER([System Type]) + '
		SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '            CASE WHEN [System Type] IN (''numeric'', ''decimal'') THEN ''('' + CONVERT(VARCHAR(3), PRECISION) + '','' + CONVERT(VARCHAR(3), SCALE) + '')'' '
		SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '                 WHEN [System Type] IN (''char'', ''varchar'', ''binary'', ''varbinary'') THEN ''('' + REPLACE(CONVERT(VARCHAR(5), MAX_LENGTH), ''-1'', ''MAX'') + '')'' '
		SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '                 WHEN [System Type] IN (''nchar'', ''nvarchar'') THEN ''('' + CASE WHEN MAX_LENGTH = -1 THEN ''MAX'' ELSE CONVERT(VARCHAR(5), MAX_LENGTH / 2) END + '')'' '
		SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '                 ELSE '''' '
		SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '            END + '
		SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '            CASE WHEN [IDENTITY] <> '''' THEN '' IDENTITY'' + [IDENTITY] ELSE '''' END + '
		SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '            CASE WHEN NULLABLE = '''' THEN '' '' ELSE '' NOT NULL'' END '
		SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '        END + CHAR(13) + CHAR(10) '
		SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + ' FROM   #Table '
		SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10)
		SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + ' PRINT ''CREATE TABLE [' + @SCHEMA + '].[' + @OBJECT + ']'' '
		SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + ' PRINT ''('' '
		SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + ' PRINT STUFF(@COL1, 5, 2, '''') '
		SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + ' PRINT '')'' '
		SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + ' PRINT '''' '
		SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + ' PRINT ''GO'' '
		SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + ' PRINT '''' '
		SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10)
		SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + ' DECLARE @SP VARCHAR(MAX) '
		SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + ' DECLARE @VAR VARCHAR(MAX) '
		SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + ' DECLARE @COL2 VARCHAR(MAX) '
		SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + ' DECLARE @COL3 VARCHAR(MAX) '
		SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10)
		SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + ' SET @SP = '''' '
		SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + ' SET @VAR = '''' '
		SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + ' SET @COL2 = '''' '
		SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + ' SET @COL3 = '''' '
		SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10)
		SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + ' SELECT @VAR = @VAR + ''    , @'' + [Column] + '' ''  '
		SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '               + UPPER([System Type]) + CASE WHEN [System Type] IN (''numeric'', ''decimal'') THEN ''('' + CONVERT(VARCHAR(3), PRECISION) + '','' + CONVERT(VARCHAR(3), SCALE) + '')'' '
		SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '                                             WHEN [System Type] IN (''char'', ''varchar'', ''binary'', ''varbinary'') THEN ''('' + REPLACE(CONVERT(VARCHAR(5), MAX_LENGTH), ''-1'', ''MAX'') + '')'' '
		SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '                                             WHEN [System Type] IN (''nchar'', ''nvarchar'') THEN ''('' + CASE WHEN MAX_LENGTH = -1 THEN ''MAX'' ELSE CONVERT(VARCHAR(5), MAX_LENGTH / 2) END + '')'' '
		SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '                                             ELSE '''' '
		SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '                                        END + CHAR(13) + CHAR(10) '
		SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '        , @COL2 = @COL2 + ''    , '' + [Column] + CHAR(13) + CHAR(10) '
		SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '        , @COL3 = @COL3 + ''    , '' + [Column] + '' = @'' + [Column] + CHAR(13) + CHAR(10) '
		SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + ' FROM   #Table '
		SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10)
		SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + ' PRINT ''CREATE PROCEDURE USP_T_'' + ''' + @OBJECT + ''' '
		SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + ' PRINT STUFF(@VAR, 5, 2, '''') '
		SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + ' PRINT ''AS'' '
		SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + ' PRINT ''SELECT '' + STUFF(@COL2, 1, 6, '''') '
		SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + ' PRINT ''FROM '' + ''' + @OBJECT + ''' + '' WITH(NOLOCK, READUNCOMMITTED)'' '
		SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + ' PRINT ''WHERE '' + REPLACE(STUFF(@COL3, 1, 6, ''''), '','', ''AND'') '
		SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + ' PRINT '''' '
		SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + ' PRINT ''INSERT INTO '' + ''' + @OBJECT + ''' '
		SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + ' PRINT ''('' '
		SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + ' PRINT STUFF(@COL2, 5, 2, '''') '
		SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + ' PRINT '')'' '
		SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + ' PRINT ''VALUES'' '
		SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + ' PRINT ''('' '
		SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + ' PRINT STUFF(REPLACE(@COL2, '', '', '', @''), 5, 2, '''') '
		SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + ' PRINT '')'' '
		SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + ' PRINT '''' '
		SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + ' PRINT ''UPDATE '' + ''' + @OBJECT + ''' '
		SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + ' PRINT ''SET '' + STUFF(@COL3, 1, 6, '''') '
		SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + ' PRINT ''WHERE '' + REPLACE(STUFF(@COL3, 1, 6, ''''), '','', ''AND'') '
	END

	IF @DEBUG = 1
	BEGIN
		PRINT @SCRIPT1
		PRINT ''
		PRINT @SCRIPT2
	END
	ELSE
	BEGIN
		SET @SCRIPT = @SCRIPT1 + CHAR(13) + CHAR(10) + @SCRIPT2

		EXEC (@SCRIPT)
	END

	DECLARE @COMPATIBILITY_LEVEL TINYINT

	SET @COMPATIBILITY_LEVEL = (SELECT COMPATIBILITY_LEVEL FROM SYS.DATABASES WHERE NAME = @DATABASE)

	DECLARE @SORTKEY NVARCHAR(MAX)

	SET @SCRIPT1 = N' USE [' + @DATABASE + ']; '
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10)
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10) + ' IF OBJECT_ID(N''tempdb..#Index'', N''U'') IS NOT NULL DROP TABLE #Index '
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10)
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10) + ' SELECT DISTINCT '
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10) + '        A.OBJECT_ID '
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10) + '        , B.INDEX_ID '
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10) + '        , [Index Name] = ISNULL(B.NAME, B.TYPE_DESC) '
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10) + '        , [Key Columns] = D.NAME + CASE WHEN C.IS_INCLUDED_COLUMN = 1 THEN NULL WHEN C.IS_INCLUDED_COLUMN = 0 AND C.IS_DESCENDING_KEY = 1 THEN '' DESC'' ELSE '''' END '
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10) + '        , [Included Columns] = CASE WHEN C.IS_INCLUDED_COLUMN = 1 THEN D.NAME ELSE NULL END '
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10) + '        , [Filter Definition] = ' + CASE WHEN @COMPATIBILITY_LEVEL >= 100 THEN 'CAST(B.FILTER_DEFINITION AS NVARCHAR(4000))' ELSE 'NULL' END
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10) + '        , ROWS = REPLACE(CONVERT(VARCHAR(30), CONVERT(MONEY, F.ROWS), 112), ''.00'', SPACE(0)) '
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10) + '        , [Description] = CASE B.TYPE WHEN 0 THEN ''Heap'' WHEN 1 THEN ''Clustered'' ELSE ''Nonclustered'' END '
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10) + '                        + CASE WHEN B.IGNORE_DUP_KEY <> 0 THEN '', Ignore Duplicate Keys'' ELSE '''' END '
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10) + '                        + CASE WHEN B.IS_UNIQUE <> 0 THEN '', Unique'' ELSE '''' END '
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10) + '                        + CASE WHEN B.IS_HYPOTHETICAL <> 0 THEN '', Hypothetical'' ELSE '''' END '
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10) + '                        + CASE WHEN B.IS_PRIMARY_KEY <> 0 THEN '', Primary Key'' ELSE '''' END '
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10) + '                        + CASE WHEN B.IS_UNIQUE_CONSTRAINT <> 0 THEN '', Unique Key'' ELSE '''' END '
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10) + '        , [File Group] = E.NAME '
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10) + '        , Disabled = CASE WHEN B.IS_DISABLED = 1 THEN ''Disabled'' ELSE '''' END '
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10) + '        , Updated = STATS_DATE(A.OBJECT_ID, B.INDEX_ID) '
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10) + '        , Ordinal = C.KEY_ORDINAL '
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10) + '        , B.NAME '
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10) + '        , C.IS_INCLUDED_COLUMN '
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10) + '        , C.INDEX_COLUMN_ID INTO #Index '
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10) + ' FROM   SYS.OBJECTS A '
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10) + '        INNER JOIN SYS.INDEXES B ON A.OBJECT_ID = B.OBJECT_ID '
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10) + '        LEFT OUTER JOIN SYS.INDEX_COLUMNS C ON B.OBJECT_ID = C.OBJECT_ID AND B.INDEX_ID = C.INDEX_ID '
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10) + '        LEFT OUTER JOIN SYS.COLUMNS D ON C.OBJECT_ID = D.OBJECT_ID AND C.COLUMN_ID = D.COLUMN_ID '
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10) + '        INNER JOIN SYS.DATA_SPACES E ON B.DATA_SPACE_ID = E.DATA_SPACE_ID '
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10) + '        INNER JOIN SYS.PARTITIONS F ON B.OBJECT_ID = F.OBJECT_ID AND B.INDEX_ID = F.INDEX_ID '
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10) + ' WHERE  A.NAME = ''' + @OBJECT + ''' '
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10) + ' ORDER BY B.NAME '
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10) + '          , C.IS_INCLUDED_COLUMN '
	SET @SCRIPT1 = @SCRIPT1 + CHAR(13) + CHAR(10) + '          , C.INDEX_COLUMN_ID '
	SET @SCRIPT2 = ' INSERT INTO #Index '
	SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + ' SELECT A.OBJECT_ID '
	SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '        , B.STATS_ID '
	SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '        , [Index Name] = B.NAME '
	SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '        , [Key Columns] = D.NAME '
	SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '        , [Included Columns] = NULL '
	SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '        , [Filter Definition] = ' + CASE WHEN @COMPATIBILITY_LEVEL >= 100 THEN 'CAST(B.FILTER_DEFINITION AS NVARCHAR(4000))' ELSE 'NULL' END
	SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '        , ROWS = NULL '
	SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '        , [Description] = ''Statistics'' '
	SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '        , [File Group] = '''' '
	SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '        , Disabled = '''' '
	SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '        , Updated = STATS_DATE(A.OBJECT_ID, B.STATS_ID) '
	SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '        , Ordinal = C.STATS_COLUMN_ID '
	SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '        , '''' '
	SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '        , '''' '
	SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '        , '''' '
	SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + ' FROM   SYS.OBJECTS A '
	SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '        INNER JOIN SYS.STATS B ON A.OBJECT_ID = B.OBJECT_ID '
	SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '        INNER JOIN SYS.STATS_COLUMNS C ON B.OBJECT_ID = C.OBJECT_ID AND B.STATS_ID = C.STATS_ID '
	SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '        INNER JOIN SYS.COLUMNS D ON C.OBJECT_ID = D.OBJECT_ID AND C.COLUMN_ID = D.COLUMN_ID '
	SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '        LEFT OUTER JOIN SYS.INDEXES E ON B.OBJECT_ID = E.OBJECT_ID AND B.STATS_ID = E.INDEX_ID '
	SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + ' WHERE  A.NAME = ''' + @OBJECT + ''' '
	SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '        AND E.NAME IS NULL '
	SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10)
	SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + ' DECLARE @INDEX_ID INT '
	SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10)
	SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + ' SET @INDEX_ID = (SELECT TOP 1 INDEX_ID FROM #INDEX WHERE [Description] LIKE ''Clustered%'' AND Disabled = '''') '
	SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + ' IF @INDEX_ID IS NULL SET @INDEX_ID = (SELECT TOP 1 INDEX_ID FROM #INDEX WHERE [Description] LIKE ''%Primary Key%'' AND Disabled = '''') '
	SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + ' IF @INDEX_ID IS NULL SET @INDEX_ID = (SELECT TOP 1 INDEX_ID FROM #INDEX WHERE [Description] LIKE ''%Unique%'' AND Disabled = '''') '
	SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + ' IF @INDEX_ID IS NULL SET @INDEX_ID = (SELECT MIN(INDEX_ID) INDEX_ID FROM #INDEX WHERE Disabled = '''' AND [Key Columns] > '''') '
	SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + ' IF @INDEX_ID IS NOT NULL '
	SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + ' BEGIN '
	SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '     SET @SORTKEY = N'''' '
	SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10)
	SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '     SELECT @SORTKEY = @SORTKEY + [Key Columns] '
	SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '     FROM (SELECT DISTINCT '
	SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '                  INDEX_ID '
	SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '                  , ISNULL('', '' + REPLACE([Key Columns] + '' DESC'', ''DESC DESC'', ''ASC''), '''') AS [Key Columns] '
	SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '                  , Ordinal '
	SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '           FROM #Index) AS [Index] '
	SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '     WHERE INDEX_ID = @INDEX_ID '
	SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '     ORDER BY Ordinal '
	SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + ' END '
	SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10)
	SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + ' SET @SORTKEY = SUBSTRING(@SORTKEY, 3, 8000) '

	IF @COMPATIBILITY_LEVEL >= 90
	BEGIN
		IF @OPTION = 'INDEXSIZE'
		BEGIN
			SET @SCRIPT3 = N' IF EXISTS (SELECT 1 FROM #Index) '
			SET @SCRIPT3 = @SCRIPT3 + CHAR(13) + CHAR(10) + ' BEGIN '
			SET @SCRIPT3 = @SCRIPT3 + CHAR(13) + CHAR(10) + '     SELECT DISTINCT '
			SET @SCRIPT3 = @SCRIPT3 + CHAR(13) + CHAR(10) + '            [Index Name] '
			SET @SCRIPT3 = @SCRIPT3 + CHAR(13) + CHAR(10) + '            , [Key Columns] = STUFF(CAST((SELECT ISNULL('', '' + [Key Columns], '''') '
			SET @SCRIPT3 = @SCRIPT3 + CHAR(13) + CHAR(10) + '                                          FROM   (SELECT DISTINCT [Index Name], [Key Columns], Ordinal FROM #Index) Z '
			SET @SCRIPT3 = @SCRIPT3 + CHAR(13) + CHAR(10) + '                                          WHERE  A.[Index Name] = Z.[Index Name] '
			SET @SCRIPT3 = @SCRIPT3 + CHAR(13) + CHAR(10) + '                                          ORDER BY Z.Ordinal '
			SET @SCRIPT3 = @SCRIPT3 + CHAR(13) + CHAR(10) + '                                          FOR XML PATH('''')) AS NVARCHAR(4000)), 1, 2, '''') '
			SET @SCRIPT3 = @SCRIPT3 + CHAR(13) + CHAR(10) + '            , [Included Columns] = ISNULL(STUFF(CAST((SELECT ISNULL('', '' + [Included Columns], '''') '
			SET @SCRIPT3 = @SCRIPT3 + CHAR(13) + CHAR(10) + '                                                      FROM   (SELECT DISTINCT [Index Name], [Included Columns], Ordinal FROM #Index) Z '
			SET @SCRIPT3 = @SCRIPT3 + CHAR(13) + CHAR(10) + '                                                      WHERE  A.[Index Name] = Z.[Index Name] '
			SET @SCRIPT3 = @SCRIPT3 + CHAR(13) + CHAR(10) + '                                                      ORDER BY Z.Ordinal '
			SET @SCRIPT3 = @SCRIPT3 + CHAR(13) + CHAR(10) + '                                                      FOR XML PATH('''')) AS NVARCHAR(4000)), 1, 2, ''''), '''') '
			SET @SCRIPT3 = @SCRIPT3 + CHAR(13) + CHAR(10) + '            , [Filter Definition] = ISNULL([Filter Definition], '''') '
			SET @SCRIPT3 = @SCRIPT3 + CHAR(13) + CHAR(10) + '            , [Row Counts] = A.ROWS '
			SET @SCRIPT3 = @SCRIPT3 + CHAR(13) + CHAR(10) + '            , [Page Counts] = REPLACE(CONVERT(VARCHAR(30), CONVERT(MONEY, CONVERT(NUMERIC(38, 2), B.PAGE_COUNT)), 112), ''.00'', SPACE(0)) '
			SET @SCRIPT3 = @SCRIPT3 + CHAR(13) + CHAR(10) + '            , [Index Size(MB)] = REPLACE(CONVERT(VARCHAR(30), CONVERT(MONEY, CONVERT(NUMERIC(38, 2), B.PAGE_COUNT * 8.0 / 1024)), 112), ''.00'', SPACE(0)) '
			SET @SCRIPT3 = @SCRIPT3 + CHAR(13) + CHAR(10) + '            , [Avg Fragmentation] = CONVERT(NUMERIC(5, 2), B.AVG_FRAGMENTATION_IN_PERCENT) '
			SET @SCRIPT3 = @SCRIPT3 + CHAR(13) + CHAR(10) + '            , [Alloc Unit Type] = B.ALLOC_UNIT_TYPE_DESC '
			SET @SCRIPT3 = @SCRIPT3 + CHAR(13) + CHAR(10) + '            , [Description] '
			SET @SCRIPT3 = @SCRIPT3 + CHAR(13) + CHAR(10) + '            , [File Group] '
			SET @SCRIPT3 = @SCRIPT3 + CHAR(13) + CHAR(10) + '            , Disabled '
			SET @SCRIPT3 = @SCRIPT3 + CHAR(13) + CHAR(10) + '            , Updated '
			SET @SCRIPT3 = @SCRIPT3 + CHAR(13) + CHAR(10) + '     FROM   #Index A '
			SET @SCRIPT3 = @SCRIPT3 + CHAR(13) + CHAR(10) + '            LEFT OUTER JOIN SYS.DM_DB_INDEX_PHYSICAL_STATS(DB_ID(), OBJECT_ID(''' + @OBJECT + '''), NULL, NULL, ''LIMITED'') B ON A.OBJECT_ID = B.OBJECT_ID AND A.INDEX_ID = B.INDEX_ID '
			SET @SCRIPT3 = @SCRIPT3 + CHAR(13) + CHAR(10) + '     ORDER BY [Description], [Index Name] '
			SET @SCRIPT3 = @SCRIPT3 + CHAR(13) + CHAR(10) + ' END '
		END
		ELSE
		BEGIN
			SET @SCRIPT3 = N' IF EXISTS (SELECT 1 FROM #Index) '
			SET @SCRIPT3 = @SCRIPT3 + CHAR(13) + CHAR(10) + ' BEGIN '
			SET @SCRIPT3 = @SCRIPT3 + CHAR(13) + CHAR(10) + '     SELECT DISTINCT '
			SET @SCRIPT3 = @SCRIPT3 + CHAR(13) + CHAR(10) + '            [Index Name] '
			SET @SCRIPT3 = @SCRIPT3 + CHAR(13) + CHAR(10) + '            , [Key Columns] = STUFF(CAST((SELECT ISNULL('', '' + [Key Columns], '''') '
			SET @SCRIPT3 = @SCRIPT3 + CHAR(13) + CHAR(10) + '                                          FROM   (SELECT DISTINCT [Index Name], [Key Columns], Ordinal FROM #Index) Z '
			SET @SCRIPT3 = @SCRIPT3 + CHAR(13) + CHAR(10) + '                                          WHERE  A.[Index Name] = Z.[Index Name] '
			SET @SCRIPT3 = @SCRIPT3 + CHAR(13) + CHAR(10) + '                                          ORDER BY Ordinal '
			SET @SCRIPT3 = @SCRIPT3 + CHAR(13) + CHAR(10) + '                                          FOR XML PATH('''')) AS NVARCHAR(4000)), 1, 2, '''') '
			SET @SCRIPT3 = @SCRIPT3 + CHAR(13) + CHAR(10) + '            , [Included Columns] = ISNULL(STUFF(CAST((SELECT ISNULL('', '' + [Included Columns], '''') '
			SET @SCRIPT3 = @SCRIPT3 + CHAR(13) + CHAR(10) + '                                                      FROM   (SELECT DISTINCT [Index Name], [Included Columns], Ordinal FROM #Index) Z '
			SET @SCRIPT3 = @SCRIPT3 + CHAR(13) + CHAR(10) + '                                                      WHERE  A.[Index Name] = Z.[Index Name] '
			SET @SCRIPT3 = @SCRIPT3 + CHAR(13) + CHAR(10) + '                                                      ORDER BY Ordinal '
			SET @SCRIPT3 = @SCRIPT3 + CHAR(13) + CHAR(10) + '                                                      FOR XML PATH('''')) AS NVARCHAR(4000)), 1, 2, ''''), '''') '
			SET @SCRIPT3 = @SCRIPT3 + CHAR(13) + CHAR(10) + '            , [Filter Definition] = ISNULL([Filter Definition], '''') '
			SET @SCRIPT3 = @SCRIPT3 + CHAR(13) + CHAR(10) + '            , [Row Counts] = A.ROWS '
			SET @SCRIPT3 = @SCRIPT3 + CHAR(13) + CHAR(10) + '            , [Description] '
			SET @SCRIPT3 = @SCRIPT3 + CHAR(13) + CHAR(10) + '            , [File Group] '
			SET @SCRIPT3 = @SCRIPT3 + CHAR(13) + CHAR(10) + '            , Disabled '
			SET @SCRIPT3 = @SCRIPT3 + CHAR(13) + CHAR(10) + '            , Updated '
			SET @SCRIPT3 = @SCRIPT3 + CHAR(13) + CHAR(10) + '     FROM   #Index A '
			SET @SCRIPT3 = @SCRIPT3 + CHAR(13) + CHAR(10) + '     ORDER BY [Description], [Index Name] '
			SET @SCRIPT3 = @SCRIPT3 + CHAR(13) + CHAR(10) + ' END '
		END

		SET @SCRIPT3 = @SCRIPT3 + CHAR(13) + CHAR(10)
		SET @SCRIPT3 = @SCRIPT3 + CHAR(13) + CHAR(10) + ' SELECT [Index Name] = ISNULL(B.NAME, B.TYPE_DESC) '
		SET @SCRIPT3 = @SCRIPT3 + CHAR(13) + CHAR(10) + '        , [Partition Number] = C.PARTITION_NUMBER '
		SET @SCRIPT3 = @SCRIPT3 + CHAR(13) + CHAR(10) + '        , [Allocation Type] = D.TYPE_DESC '
		SET @SCRIPT3 = @SCRIPT3 + CHAR(13) + CHAR(10) + '        , [File Group] = E.NAME '
		SET @SCRIPT3 = @SCRIPT3 + CHAR(13) + CHAR(10) + ' FROM   SYS.OBJECTS A '
		SET @SCRIPT3 = @SCRIPT3 + CHAR(13) + CHAR(10) + '        INNER JOIN SYS.INDEXES B ON A.OBJECT_ID = B.OBJECT_ID '
		SET @SCRIPT3 = @SCRIPT3 + CHAR(13) + CHAR(10) + '        INNER JOIN SYS.PARTITIONS C ON B.OBJECT_ID = C.OBJECT_ID AND B.INDEX_ID = C.INDEX_ID '
		SET @SCRIPT3 = @SCRIPT3 + CHAR(13) + CHAR(10) + '        INNER JOIN SYS.ALLOCATION_UNITS D ON C.PARTITION_ID = D.CONTAINER_ID '
		SET @SCRIPT3 = @SCRIPT3 + CHAR(13) + CHAR(10) + '        INNER JOIN SYS.DATA_SPACES E ON D.DATA_SPACE_ID = E.DATA_SPACE_ID '
		SET @SCRIPT3 = @SCRIPT3 + CHAR(13) + CHAR(10) + ' WHERE  A.NAME = ''' + @OBJECT + ''' '
		SET @SCRIPT3 = @SCRIPT3 + CHAR(13) + CHAR(10) + ' ORDER BY 1, 2 '

		IF @DEBUG = 1
		BEGIN
			PRINT ''
			PRINT @SCRIPT1
			PRINT ''
			PRINT @SCRIPT2
			PRINT ''
			PRINT @SCRIPT3
		END
		ELSE
		BEGIN
			SET @SCRIPT = @SCRIPT1 + CHAR(13) + CHAR(10) + @SCRIPT2 + CHAR(13) + CHAR(10) + @SCRIPT3

			EXEC SP_EXECUTESQL @SCRIPT, N'@SORTKEY NVARCHAR(4000) OUTPUT', @SORTKEY = @SORTKEY OUTPUT
		END
	END
	ELSE
	BEGIN
		IF @OPTION = 'INDEXSIZE'
		BEGIN
			SET @SCRIPT2 = N' DECLARE @FragList TABLE '
			SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + ' ( '
			SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '     ObjectName CHAR(255) '
			SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '     , Object_ID INT '
			SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '     , IndexName CHAR(255) '
			SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '     , Index_ID INT '
			SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '     , Level INT '
			SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '     , Pages INT '
			SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '     , Rows INT '
			SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '     , MinRecSize INT '
			SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '     , MaxRecSize INT '
			SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '     , AvgRecSize FLOAT '
			SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '     , ForRecCount INT '
			SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '     , Extents INT '
			SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '     , ExtentSwitches INT '
			SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '     , AvgFreeBytes FLOAT '
			SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '     , AvgPageDensity FLOAT '
			SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '     , ScanDensity FLOAT '
			SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '     , BestCount INT '
			SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '     , ActualCount INT '
			SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '     , LogicalFrag FLOAT '
			SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '     , ExtentFrag FLOAT '
			SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + ' ) '
			SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10)
			SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + ' IF @TYPE = ''U'' '
			SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + ' BEGIN '
			SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '     INSERT @FragList '
			SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '     EXEC (''DBCC SHOWCONTIG('''''' + ''' + @OBJECT + ''' + '''''', '''''''') WITH TABLERESULTS, ALL_INDEXES, NO_INFOMSGS, FAST'') '
			SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + ' END '
			SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10)
			SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + ' IF EXISTS (SELECT 1 FROM #Index) '
			SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + ' BEGIN '
			SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '     SELECT DISTINCT '
			SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '            [Index Name] '
			SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '            , [Key Columns] = STUFF(CAST((SELECT ISNULL('', '' + [Key Columns], '''') '
			SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '                                          FROM #Index Z '
			SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '                                          WHERE A.[Index Name] = Z.[Index Name] '
			SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '                                          ORDER BY Ordinal '
			SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '                                          FOR XML PATH('''')) AS NVARCHAR(4000)), 1, 2, '''') '
			SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '            , [Included Columns] = ISNULL(STUFF(CAST((SELECT ISNULL('', '' + [Included Columns], '''') '
			SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '                                                      FROM   #Index Z '
			SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '                                                      WHERE  A.[Index Name] = Z.[Index Name] '
			SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '                                                      ORDER BY Ordinal '
			SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '                                                      FOR XML PATH('''')) AS NVARCHAR(4000)), 1, 2, ''''), '''') '
			SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '            , [Filter Definition] = ISNULL([Filter Definition], '''') '
			SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '            , [Row Counts] = A.ROWS '
			SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '            , [Index Size(MB)] = REPLACE(CONVERT(VARCHAR(30), CONVERT(MONEY, CONVERT(NUMERIC(38, 2), B.Pages * 8.0 / 1024)), 112), ''.00'', SPACE(0)) '
			SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '            , [Avg Fragmentation] = CONVERT(NUMERIC(5, 2), B.LogicalFrag) '
			SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '            , [Description] '
			SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '            , [File Group] '
			SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '            , Disabled '
			SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '            , Updated '
			SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '     FROM   #Index A '
			SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '            LEFT OUTER JOIN @FragList B ON A.OBJECT_ID = B.OBJECT_ID AND A.INDEX_ID = B.INDEX_ID '
			SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '     ORDER BY [Description], [Index Name] '
			SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + ' END '
		END
		ELSE
		BEGIN
			SET @SCRIPT2 = N' IF EXISTS (SELECT 1 FROM #Index) '
			SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + ' BEGIN '
			SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '     SELECT DISTINCT '
			SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '            [Index Name] '
			SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '            , [Key Columns] = STUFF(CAST((SELECT ISNULL('', '' + [Key Columns], '''') '
			SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '                                          FROM   #Index Z '
			SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '                                          WHERE  A.[Index Name] = Z.[Index Name] '
			SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '                                          ORDER BY Ordinal '
			SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '                                          FOR XML PATH('''')) AS NVARCHAR(4000)), 1, 2, '''') '
			SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '            , [Included Columns] = ISNULL(STUFF(CAST((SELECT ISNULL('', '' + [Included Columns], '''') '
			SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '                                                      FROM   #Index Z '
			SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '                                                      WHERE  A.[Index Name] = Z.[Index Name] '
			SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '                                                      ORDER BY Ordinal '
			SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '                                                      FOR XML PATH('''')) AS NVARCHAR(4000)), 1, 2, ''''), '''') '
			SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '            , [Filter Definition] = ISNULL([Filter Definition], '''') '
			SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '            , [Row Counts] = A.ROWS '
			SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '            , [Description] '
			SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '            , [File Group] '
			SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '            , Disabled '
			SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '            , Updated '
			SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '     FROM   #Index A '
			SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + '     ORDER BY [Description], [Index Name] '
			SET @SCRIPT2 = @SCRIPT2 + CHAR(13) + CHAR(10) + ' END '
		END

		IF @DEBUG = 1
		BEGIN
			PRINT ''
			PRINT @SCRIPT1
			PRINT ''
			PRINT @SCRIPT2
		END
		ELSE
		BEGIN
			SET @SCRIPT = @SCRIPT1 + CHAR(13) + CHAR(10) + @SCRIPT2

			EXEC SP_EXECUTESQL @SCRIPT, N'@SORTKEY NVARCHAR(4000) OUTPUT', @SORTKEY = @SORTKEY OUTPUT
		END
	END

	SET @SCRIPT = N' USE [' + @DATABASE + ']; '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10)
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' IF OBJECT_ID(''tempdb..#Foreign'', N''U'') IS NOT NULL DROP TABLE #Foreign '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10)
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' SELECT [Type] = B.TYPE_DESC '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , B.Name '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , [Schema] = SCHEMA_NAME(C.SCHEMA_ID) '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , [Table] = C.NAME '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , [Column] = D.NAME '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , [Reference Schema] = SCHEMA_NAME(E.SCHEMA_ID) '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , [Reference Table] = E.NAME '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , [Reference Column] = F.NAME '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , [Level] = CASE WHEN E.NAME = ''' + @OBJECT + ''' THEN 0 ELSE 1 END INTO #Foreign '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' FROM   SYS.FOREIGN_KEY_COLUMNS A '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        INNER JOIN SYS.OBJECTS B ON A.CONSTRAINT_OBJECT_ID = B.OBJECT_ID '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        INNER JOIN SYS.OBJECTS C ON A.PARENT_OBJECT_ID = C.OBJECT_ID '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        INNER JOIN SYS.COLUMNS D ON C.OBJECT_ID = D.OBJECT_ID AND A.PARENT_COLUMN_ID = D.COLUMN_ID '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        INNER JOIN SYS.OBJECTS E ON A.REFERENCED_OBJECT_ID = E.OBJECT_ID '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        INNER JOIN SYS.COLUMNS F ON E.OBJECT_ID = F.OBJECT_ID AND A.REFERENCED_COLUMN_ID = F.COLUMN_ID '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' WHERE  (C.NAME = ''' + @OBJECT + ''' AND C.SCHEMA_ID = SCHEMA_ID(''' + @SCHEMA + ''')) OR E.NAME = ''' + @OBJECT + ''' '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10)
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' IF EXISTS (SELECT 1 FROM #Foreign) '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' BEGIN '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '     SELECT Z.[Type] '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '            , Z.[Name] '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '            , Z.[Schema] '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '            , Z.[Table] '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '            , [Column] = CAST(Z.[Column] AS NVARCHAR(4000)) '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '            , Z.[Reference Schema] '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '            , Z.[Reference Table] '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '            , [Reference Column] = CAST(Z.[Reference Column] AS NVARCHAR(4000)) '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '     FROM   (SELECT DISTINCT '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '                    [Type] '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '                    , [Name] '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '                    , [Schema] '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '                    , [Table] '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '                    , [Column] = STUFF((SELECT '', '' + [Column] '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '                                        FROM   #Foreign B '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '                                        WHERE  A.[Name] = B.[Name] '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '                                        FOR XML PATH('''')), 1, 2, '''') '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '                    , [Reference Schema] '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '                    , [Reference Table] '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '                    , [Reference Column] = STUFF((SELECT '', '' + [Reference Column] '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '                                                  FROM   #Foreign B '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '                                                  WHERE  A.[Name] = B.[Name] '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '                                                  FOR XML PATH('''')), 1, 2, '''') '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '                    , [Level] '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '             FROM   #Foreign A) Z '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '     ORDER BY Z.[Level] DESC, 1, 2, 3, 4, 5 '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' END '

	IF @DEBUG = 1
	BEGIN
		PRINT ''
		PRINT @SCRIPT
	END
	ELSE
	BEGIN
		EXEC (@SCRIPT)
	END

	SET @SCRIPT = N' USE [' + @DATABASE + ']; '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10)
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' IF OBJECT_ID(''tempdb..#Trigger'', N''U'') IS NOT NULL DROP TABLE #Trigger '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10)
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' IF EXISTS (SELECT 1 FROM SYS.OBJECTS WHERE PARENT_OBJECT_ID = OBJECT_ID(''' + @OBJECT + ''') AND TYPE = ''TR'') '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' BEGIN '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '     SELECT [Type] = B.TYPE_DESC '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '            , [Name] = B.NAME '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '            , [Events] = D.TYPE_DESC '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '            , [Disabled] = CASE WHEN C.IS_DISABLED = 1 THEN ''Y'' ELSE '''' END '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '            , [Instead of Trigger] = CASE WHEN C.IS_INSTEAD_OF_TRIGGER = 1 THEN ''Y'' ELSE '''' END INTO #Trigger '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '     FROM   SYS.OBJECTS A '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '            INNER JOIN SYS.OBJECTS B ON A.OBJECT_ID = B.PARENT_OBJECT_ID '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '            INNER JOIN SYS.TRIGGERS C ON B.OBJECT_ID = C.OBJECT_ID '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '            INNER JOIN SYS.TRIGGER_EVENTS D ON B.OBJECT_ID = D.OBJECT_ID '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '     WHERE  A.NAME = ''' + @OBJECT + ''' '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '            AND B.TYPE = ''TR'' '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10)
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '     SELECT DISTINCT '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '            [Type] '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '            , [Name] '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '            , [Events] = STUFF((SELECT '', '' + [Events] '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '                                FROM   #Trigger B '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '                                WHERE  A.[Name] = B.[Name] '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '                                FOR XML PATH('''')), 1, 2, '''') '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '            , [Disabled] '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '            , [Instead of Trigger] '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '     FROM   #Trigger A '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '     ORDER BY 1 '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' END '

	IF @DEBUG = 1
	BEGIN
		PRINT ''
		PRINT @SCRIPT
	END
	ELSE
	BEGIN
		EXEC (@SCRIPT)
	END

	SET @SCRIPT = N' USE [' + @DATABASE + ']; '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10)
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' SELECT TOP 100 * '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' FROM [' + @SCHEMA + '].[' + @OBJECT + '] WITH(NOLOCK, READUNCOMMITTED) '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + CASE WHEN @SORTKEY IS NULL THEN '' ELSE ' ORDER BY ' + @SORTKEY END

	IF @DEBUG = 1
	BEGIN
		PRINT ''
		PRINT @SCRIPT
	END
	ELSE
	BEGIN
		EXEC (@SCRIPT)
	END
END

SET @SCRIPT = ' USE [' + @DATABASE + ']; '
SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10)
SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' SELECT @TYPE_DESC = ''STATS'' '
SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' FROM   SYS.STATS '
SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' WHERE  NAME = ''' + @OBJECT + ''' '

SET @TYPE_DESC = NULL
EXEC SP_EXECUTESQL @SCRIPT, N'@TYPE_DESC NVARCHAR(60) OUTPUT', @TYPE_DESC = @TYPE_DESC OUTPUT

IF @TYPE_DESC = 'STATS'
BEGIN
	SET @SCRIPT = ' USE [' + @DATABASE + ']; '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10)
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' IF OBJECT_ID(''tempdb..#STAT_HEADER'', N''U'') IS NOT NULL DROP TABLE #STAT_HEADER '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' IF OBJECT_ID(''tempdb..#DENSITY_VECTOR'', N''U'') IS NOT NULL DROP TABLE #DENSITY_VECTOR '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' IF OBJECT_ID(''tempdb..#HISTOGRAM'', N''U'') IS NOT NULL DROP TABLE #HISTOGRAM '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10)
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' DECLARE @TABLE SYSNAME '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' DECLARE @SCHEMA SYSNAME '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10)
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' SELECT @TABLE = B.NAME '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , @SCHEMA = SCHEMA_NAME(B.SCHEMA_ID) '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' FROM   SYS.STATS A '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        INNER JOIN SYS.OBJECTS B ON A.OBJECT_ID = B.OBJECT_ID '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' WHERE  A.NAME = ''' + @OBJECT + ''' '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10)
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' DECLARE @Rows BIGINT '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10)
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' CREATE TABLE #STAT_HEADER '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' ( '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '     Name SYSNAME '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '     , Updated DATETIME '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '     , Rows BIGINT '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '     , Rows_Sampled BIGINT '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '     , Steps INT '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '     , Density REAL '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '     , Average_Key_Length INT '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '     , String_Index VARCHAR(MAX) '

	IF @ProductVersion >= 10
	BEGIN
		SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '     , Filter_Expression NVARCHAR(MAX) '
		SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '     , Unfiltered_Rows BIGINT '
	END

	IF @ProductVersion >= 13
	BEGIN
		SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '     , Persisted_Sample_Percent REAL '
	END

	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' ) '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10)
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '  INSERT #STAT_HEADER (Name, Updated, Rows, Rows_Sampled, Steps, Density, Average_Key_Length, String_Index'

	IF @ProductVersion >= 10
	BEGIN
		SET @SCRIPT = @SCRIPT + ', Filter_Expression, Unfiltered_Rows'
	END

	IF @ProductVersion >= 13
	BEGIN
		SET @SCRIPT = @SCRIPT + ', Persisted_Sample_Percent'
	END

	SET @SCRIPT = @SCRIPT + ') '

	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '  EXEC (''DBCC SHOW_STATISTICS ('''''' + @SCHEMA + ''.'' + @TABLE + '''''', ''''' + @OBJECT + ''''') WITH NO_INFOMSGS, STAT_HEADER'') '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10)
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' SELECT Name '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , Updated '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , Rows = REPLACE(CONVERT(VARCHAR(30), CONVERT(MONEY, Rows), 112), ''.00'', SPACE(0)) '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , [Rows Sampled] = REPLACE(CONVERT(VARCHAR(30), CONVERT(MONEY, Rows_Sampled), 112), ''.00'', SPACE(0)) '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , [Sample Rate] = CONVERT(NUMERIC(5, 2), 100.0 * Rows_Sampled / Rows) '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , Steps '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , Density '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , [Average Key Length] = Average_Key_Length '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , [String Index] = String_Index '

	IF @ProductVersion >= 10
	BEGIN
		SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , [Filter Expression] = Filter_Expression '
		SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , [Unfiltered Rows] = REPLACE(CONVERT(VARCHAR(30), CONVERT(MONEY, Unfiltered_Rows), 112), ''.00'', SPACE(0)) '
	END

	IF @ProductVersion >= 13
	BEGIN
		SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , [Persisted Sample Percent] = Persisted_Sample_Percent '
	END

	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' FROM   #STAT_HEADER '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10)
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' SET @Rows = (SELECT Rows FROM #STAT_HEADER) '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10)
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' CREATE TABLE #DENSITY_VECTOR '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' ( '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '     All_Density REAL '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '     , Average_Length INT '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '     , Columns NVARCHAR(MAX) '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' ) '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10)
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' INSERT #DENSITY_VECTOR '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' EXEC (''DBCC SHOW_STATISTICS ('''''' + @SCHEMA + ''.'' + @TABLE + '''''', ''''' + @OBJECT + ''''') WITH NO_INFOMSGS, DENSITY_VECTOR'') '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10)
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' SELECT [All Density] = All_Density '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , [Estimate Rows] = REPLACE(CONVERT(VARCHAR(32), CONVERT(MONEY, @Rows * All_Density), 1), ''.00'', '''') '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , [Average Length] = Average_Length '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , Columns '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' FROM   #DENSITY_VECTOR '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10)
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' CREATE TABLE #HISTOGRAM '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' ( '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '     Range_Hi_Key NVARCHAR(1000) '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '     , Range_Rows NUMERIC(38, 2) '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '     , EQ_Rows NUMERIC(38, 2) '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '     , Distinct_Range_Rows NUMERIC(38, 2) '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '     , Avg_Range_Rows NUMERIC(38, 2) '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' ) '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10)
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' INSERT #HISTOGRAM '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' EXEC (''DBCC SHOW_STATISTICS ('''''' + @SCHEMA + ''.'' + @TABLE + '''''', ''''' + @OBJECT + ''''') WITH NO_INFOMSGS, HISTOGRAM'') '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10)
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' SELECT [Range Hi Key] = Range_Hi_Key '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , [Range Rows] = REPLACE(CONVERT(VARCHAR(32), CONVERT(MONEY, Range_Rows), 1), ''.00'', '''') '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , [EQ Rows] = REPLACE(CONVERT(VARCHAR(32), CONVERT(MONEY, EQ_Rows), 1), ''.00'', '''') '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , [Distinct Range Rows] = REPLACE(CONVERT(VARCHAR(32), CONVERT(MONEY, Distinct_Range_Rows), 1), ''.00'', '''') '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , [Avg Range Rows] = REPLACE(CONVERT(VARCHAR(32), CONVERT(MONEY, Avg_Range_Rows), 1), ''.00'', '''') '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' FROM #HISTOGRAM '

	IF @DEBUG = 1
	BEGIN
		PRINT ''
		PRINT @SCRIPT
	END
	ELSE
	BEGIN
		EXEC (@SCRIPT)
	END
END

SET @SCRIPT = ' USE [' + @DATABASE + ']; '
SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10)
SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' SELECT @TYPE_DESC = ''COLUMNS'' '
SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' FROM   SYS.COLUMNS '
SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' WHERE  NAME = ''' + @OBJECT + ''' '

SET @TYPE_DESC = NULL
EXEC SP_EXECUTESQL @SCRIPT, N'@TYPE_DESC NVARCHAR(60) OUTPUT', @TYPE_DESC = @TYPE_DESC OUTPUT

IF @TYPE_DESC = 'COLUMNS'
BEGIN
	SET @SCRIPT = ' USE [' + @DATABASE + ']; '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10)
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' SELECT [Type] = A.TYPE_DESC '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , [Schema] = SCHEMA_NAME(A.SCHEMA_ID) '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , [Name] = A.NAME '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , [Column] = B.NAME '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , [Description] = ISNULL(L.VALUE, '''') '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , [User Type] = C.NAME '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , [System Type] = D.NAME '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , [Max Length] = B.MAX_LENGTH '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , B.Precision '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , B.Scale '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , Nullable = CASE WHEN B.IS_NULLABLE = ''0'' THEN ''NOT NULL'' ELSE '''' END '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , Collation = B.collation_name '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , [Identity] = ISNULL(''('' + CONVERT(VARCHAR(10), E.SEED_VALUE) + '','' + CONVERT(VARCHAR(10), E.INCREMENT_VALUE) + '')'', '''') '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , [Computed] = ISNULL(F.DEFINITION, '''') '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , [Default] = ISNULL(ISNULL(G.NAME + '' AS '' + G.DEFINITION, H.DEFINITION), '''') '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , [Check] = ISNULL(J.Name + '' AS '' + J.DEFINITION, '''') '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , [Rule] = ISNULL(K.DEFINITION, '''') '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' FROM   SYS.OBJECTS A '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        INNER JOIN SYS.COLUMNS B ON A.OBJECT_ID = B.OBJECT_ID '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        INNER JOIN SYS.TYPES C ON B.USER_TYPE_ID = C.USER_TYPE_ID '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        INNER JOIN SYS.TYPES D ON B.SYSTEM_TYPE_ID = D.SYSTEM_TYPE_ID AND B.SYSTEM_TYPE_ID = D.USER_TYPE_ID '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        LEFT OUTER JOIN SYS.IDENTITY_COLUMNS E ON B.OBJECT_ID = E.OBJECT_ID AND B.COLUMN_ID = E.COLUMN_ID '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        LEFT OUTER JOIN SYS.COMPUTED_COLUMNS F ON B.OBJECT_ID = F.OBJECT_ID AND B.COLUMN_ID = F.COLUMN_ID '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        LEFT OUTER JOIN SYS.DEFAULT_CONSTRAINTS G ON B.DEFAULT_OBJECT_ID = G.OBJECT_ID AND B.COLUMN_ID = G.PARENT_COLUMN_ID '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        LEFT OUTER JOIN SYS.SQL_MODULES H ON B.DEFAULT_OBJECT_ID = H.OBJECT_ID '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        LEFT OUTER JOIN SYS.CHECK_CONSTRAINTS J ON B.OBJECT_ID = J.PARENT_OBJECT_ID AND B.COLUMN_ID = J.PARENT_COLUMN_ID '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        LEFT OUTER JOIN SYS.SQL_MODULES K ON B.RULE_OBJECT_ID = K.OBJECT_ID '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        LEFT OUTER JOIN SYS.EXTENDED_PROPERTIES L ON B.OBJECT_ID = L.MAJOR_ID AND B.COLUMN_ID = L.MINOR_ID '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' WHERE  B.NAME = ''' + @OBJECT + ''''
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' ORDER BY 2, 3 '

	IF @DEBUG = 1
	BEGIN
		PRINT ''
		PRINT @SCRIPT
	END
	ELSE
	BEGIN
		EXEC (@SCRIPT)
	END
END

SET @SCRIPT = ' USE [' + @DATABASE + ']; '
SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10)
SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' SELECT @TYPE_DESC = ''TYPES'' '
SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' FROM   SYS.TYPES '
SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' WHERE  NAME = ''' + @OBJECT + ''' '

SET @TYPE_DESC = NULL
EXEC SP_EXECUTESQL @SCRIPT, N'@TYPE_DESC NVARCHAR(60) OUTPUT', @TYPE_DESC = @TYPE_DESC OUTPUT

IF @TYPE_DESC = 'TYPES'
BEGIN
	SET @SCRIPT = ' USE [' + @DATABASE + ']; '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10)
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' SELECT [Type] = ''Type'' '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , [Schema] = B.NAME '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , A.Name '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , [System Type] = C.NAME '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , [Length] = CASE WHEN C.NAME IN (N''NCHAR'', N''NVARCHAR'') AND A.MAX_LENGTH <> - 1 THEN A.MAX_LENGTH / 2 ELSE A.MAX_LENGTH END '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , [Precision] = A.PRECISION '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , [Scale] = A.SCALE '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , [Nullable] = CASE WHEN A.IS_NULLABLE = 0 THEN ''NOT NULL'' ELSE '''' END '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' FROM   SYS.TYPES AS A '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        INNER JOIN SYS.SCHEMAS AS B ON B.SCHEMA_ID = A.SCHEMA_ID '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        LEFT OUTER JOIN SYS.TYPES AS C ON (C.USER_TYPE_ID = A.SYSTEM_TYPE_ID AND C.USER_TYPE_ID = C.SYSTEM_TYPE_ID) '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '                                       OR (C.SYSTEM_TYPE_ID = A.SYSTEM_TYPE_ID AND C.USER_TYPE_ID = A.USER_TYPE_ID AND C.IS_USER_DEFINED = 0 AND C.IS_ASSEMBLY_TYPE = 1) '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' WHERE  A.NAME = ''' + @OBJECT + ''''
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10)
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' SELECT [Type] = A.TYPE_DESC '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , [Schema] = SCHEMA_NAME(A.SCHEMA_ID) '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , [Name] = A.NAME '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , [Column] = B.NAME '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , [Description] = ISNULL(L.VALUE, '''') '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , [User Type] = C.NAME '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , [System Type] = D.NAME '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , [Max Length] = B.MAX_LENGTH '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , B.Precision '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , B.Scale '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , Nullable = CASE WHEN B.IS_NULLABLE = ''0'' THEN ''NOT NULL'' ELSE '''' END '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , [Identity] = ISNULL(''('' + CONVERT(VARCHAR(10), E.SEED_VALUE) + '','' + CONVERT(VARCHAR(10), E.INCREMENT_VALUE) + '')'', '''') '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , [Computed] = ISNULL(F.DEFINITION, '''') '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , [Default] = ISNULL(ISNULL(G.NAME + '' AS '' + G.DEFINITION, H.DEFINITION), '''') '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , [Check] = ISNULL(J.Name + '' AS '' + J.DEFINITION, '''') '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , [Rule] = ISNULL(K.DEFINITION, '''') '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' FROM   SYS.OBJECTS A '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        INNER JOIN SYS.COLUMNS B ON A.OBJECT_ID = B.OBJECT_ID '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        INNER JOIN SYS.TYPES C ON B.USER_TYPE_ID = C.USER_TYPE_ID '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        INNER JOIN SYS.TYPES D ON B.SYSTEM_TYPE_ID = D.SYSTEM_TYPE_ID AND B.SYSTEM_TYPE_ID = D.USER_TYPE_ID '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        LEFT OUTER JOIN SYS.IDENTITY_COLUMNS E ON B.OBJECT_ID = E.OBJECT_ID AND B.COLUMN_ID = E.COLUMN_ID '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        LEFT OUTER JOIN SYS.COMPUTED_COLUMNS F ON B.OBJECT_ID = F.OBJECT_ID AND B.COLUMN_ID = F.COLUMN_ID '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        LEFT OUTER JOIN SYS.DEFAULT_CONSTRAINTS G ON B.DEFAULT_OBJECT_ID = G.OBJECT_ID AND B.COLUMN_ID = G.PARENT_COLUMN_ID '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        LEFT OUTER JOIN SYS.SQL_MODULES H ON B.DEFAULT_OBJECT_ID = H.OBJECT_ID '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        LEFT OUTER JOIN SYS.CHECK_CONSTRAINTS J ON B.OBJECT_ID = J.PARENT_OBJECT_ID AND B.COLUMN_ID = J.PARENT_COLUMN_ID '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        LEFT OUTER JOIN SYS.SQL_MODULES K ON B.RULE_OBJECT_ID = K.OBJECT_ID '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        LEFT OUTER JOIN SYS.EXTENDED_PROPERTIES L ON B.OBJECT_ID = L.MAJOR_ID AND B.COLUMN_ID = L.MINOR_ID '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' WHERE  C.NAME = ''' + @OBJECT + ''''
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' ORDER BY 2, 3 '

	IF @DEBUG = 1
	BEGIN
		PRINT ''
		PRINT @SCRIPT
	END
	ELSE
	BEGIN
		EXEC (@SCRIPT)
	END
END

IF @ProductVersion >= 10
BEGIN
	SET @SCRIPT = ' USE [' + @DATABASE + ']; '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10)
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' SELECT @TYPE_DESC = ''TABLE_TYPES'' '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' FROM   SYS.TABLE_TYPES '
	SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' WHERE  NAME = ''' + @OBJECT + ''' '

	SET @TYPE_DESC = NULL
	EXEC SP_EXECUTESQL @SCRIPT, N'@TYPE_DESC NVARCHAR(60) OUTPUT', @TYPE_DESC = @TYPE_DESC OUTPUT

	IF @TYPE_DESC = 'TABLE_TYPES'
	BEGIN
		SET @SCRIPT = ' USE [' + @DATABASE + ']; '
		SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10)
		SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' SELECT [Type] = ''Table Type'' '
		SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , [Schema] = SCHEMA_NAME(A.SCHEMA_ID) '
		SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , [Name] = A.NAME '
		SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , [Column] = C.NAME '
		SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , [InPrimaryKey] = ISNULL(E.INDEX_COLUMN_ID, 0) '
		SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , [IsForeignKey] = ISNULL((SELECT TOP 1 1  '
		SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '                                   FROM   SYS.FOREIGN_KEY_COLUMNS AS COLFK '
		SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '                                   WHERE  COLFK.PARENT_COLUMN_ID = C.COLUMN_ID '
		SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '                                          AND COLFK.PARENT_OBJECT_ID = C.OBJECT_ID), 0) '
		SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , [DataType] = F.NAME '
		SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , [SystemType] = ISNULL(G.NAME, '''') '
		SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , [Length] = CASE WHEN G.NAME IN (N''NCHAR'', N''NVARCHAR'') AND C.MAX_LENGTH <> - 1 THEN C.MAX_LENGTH / 2 ELSE C.MAX_LENGTH END '
		SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , [NumericPrecision] = C.PRECISION '
		SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , [NumericScale] = C.SCALE '
		SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , [Nullable] = CASE WHEN C.IS_NULLABLE = 0 THEN ''NOT NULL'' ELSE '''' END '
		SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        , [Computed] = C.IS_COMPUTED '
		SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' FROM   SYS.TABLE_TYPES A '
		SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        INNER JOIN SYS.SCHEMAS B ON A.SCHEMA_ID = B.SCHEMA_ID '
		SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        INNER JOIN SYS.ALL_COLUMNS C ON A.TYPE_TABLE_OBJECT_ID = C.OBJECT_ID '
		SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        LEFT OUTER JOIN SYS.INDEXES D ON C.OBJECT_ID = D.OBJECT_ID AND D.IS_PRIMARY_KEY = 1 '
		SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        LEFT OUTER JOIN SYS.INDEX_COLUMNS E ON D.INDEX_ID = E.INDEX_ID AND C.COLUMN_ID = E.COLUMN_ID AND C.OBJECT_ID = E.OBJECT_ID AND E.IS_INCLUDED_COLUMN = 0 '
		SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        LEFT OUTER JOIN SYS.TYPES F ON C.USER_TYPE_ID = F.USER_TYPE_ID '
		SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        LEFT OUTER JOIN SYS.TYPES G ON (C.SYSTEM_TYPE_ID = G.USER_TYPE_ID AND G.SYSTEM_TYPE_ID = G.USER_TYPE_ID) '
		SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '                                    OR (C.SYSTEM_TYPE_ID = G.SYSTEM_TYPE_ID AND C.USER_TYPE_ID = G.USER_TYPE_ID AND G.IS_USER_DEFINED = 0 AND G.IS_ASSEMBLY_TYPE = 1) '
		SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        LEFT OUTER JOIN SYS.XML_SCHEMA_COLLECTIONS AS H ON C.XML_COLLECTION_ID = H.XML_COLLECTION_ID '
		SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + '        LEFT OUTER JOIN SYS.SCHEMAS J ON H.SCHEMA_ID = J.SCHEMA_ID '
		SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' WHERE  A.NAME = ''' + @OBJECT + ''''
		SET @SCRIPT = @SCRIPT + CHAR(13) + CHAR(10) + ' ORDER BY C.COLUMN_ID ASC '

		IF @DEBUG = 1
		BEGIN
			PRINT ''
			PRINT @SCRIPT
		END
		ELSE
		BEGIN
			EXEC (@SCRIPT)
		END
	END
END
이 프로시저를 master 데이터베이스에 생성하면 모든 DB에서 동작합니다.. 아래는 실행 결과입니다.
DBUpgradeHistory는 테이블 이름입니다.
SP_HELPX DBUpgradeHistory
이렇게 실행할 수도 있고 저는 Ctrl+F1에 SP_HELPX를 등록해두었기 때문에 이름을 선택하고 Ctrl+F1을 누르면 실행됩니다.