블로그 이미지
불쥐의 눈으로 본세상 ㏈ª ☞ β┖υΕJini.κR

카테고리

분류 전체보기 (234)
By β┖υΕJini (131)
㏈ª By β┖υΕJini (103)
Total268,275
Today60
Yesterday69

'㏈ª By β┖υΕJini/MS-SQL'에 해당되는 글 88건

  1. 2015.06.24 SQLTAG BOOK 2 소개
  2. 2013.05.02 SQL2012 SSMS 설치 Error (install_dotnet_core 멈춤 현상) 해결방법
  3. 2013.05.02 SQL 2000 Merge replication Error (Invalid object name ctsv_XXXX )
  4. 2013.05.02 SSMS(SQL Management Studio) 실행이 느릴때!!!
  5. 2013.04.18 데이터베이스의 모든 테이블의 콜레이션 변경 하기
  6. 2013.04.15 TEMPDB MDF 증가 후 축소 되지 않을때
  7. 2013.04.10 NEWSEQUENTIALID()
  8. 2013.02.27 SQL Server 컬럼에 대한 Description 확인 쿼리
  9. 2013.02.08 SQL Server SP 상단 주석 제거
  10. 2012.12.21 RECOVERY_PENDING 복구 방법
  11. 2012.12.13 Merge Replication 수동 삭제 및 서버 변경에 따른 Hostname 변경 (SQL 2000)
  12. 2012.12.12 Dynamic PIVOT CLR
  13. 2012.12.03 Error: 7886, Severity: 20, State: 1 A read operation on a large object failed while sending data to the client. A common cause for this is if the application is running in READ UNCOMMITTED isolation level. This connection will be terminated.
  14. 2012.11.07 SSMS , Replication Monitor 스냅샷 생성이 되지 않는 현상에 대한 해결 방법
  15. 2012.08.28 Merge Replication - Could not delete the subscription at Subscriber 'XXXXX' in database 'XXXXDB'.
  16. 2012.08.27 Error 8646: The index entry for row ID was not fount in index ID 2, of table Error
  17. 2012.05.10 SELECT INTO failed because the following SET options have incorrect settings: 'ANSI_PADDING'. Verify that SET options are correct for use with indexed views and/or indexes on computed columns and/or query notifications and/or xml data type methods. (Sou..
  18. 2012.02.17 DB 속성 보기 Error (9)
  19. 2011.12.30 Delete Publication: the principal "dbo" does not exist, this type of principal cannot be impersonated, or you do not have permission" (2)
  20. 2011.08.30 SQL 2008 R2 64bit To SQL 2000 32Bit Linked Server Error

제가 저자로 참여한 두번째 책 입니다.

 

 

책소개

 추천서

최근 우리 나라도 IT 강국의 대열에 올랐다는 이야기를 많이 합니다. 그리고 여러 다양한 국내외 신문 기사를 보면 그 내용을 뒷받침하는 기사들이 홍수같이 쏟아져서 ‘IT 강국 코리아’ 라는 말이 어색하지 않게 느껴집니다. 그래서일까요? 이제는 예전보다 훨씬 더 많은 IT 관련서적을 더 쉽게 접할 수 있는 환경이 되었습니다. 관계형 데이터베이스 분야도 마찬가지인 것 같습니다. 처음 데이터베이스를 공부할 때만 해도, 대학교재와 다양한 기술서적은 대부분 원서였습니다. 국내서적이라고 해도 번역본이 대부분이고, 그마저도 번역의 수준이 상당히 떨어지는 경우가 많아서 차라리 원서가 더 읽기 편한 경우가 많았습니다. 그런데 이제는 상황이 많이 달라진 것 같습니다. 2014년 4월 현재 국내 최대 규모의 인터넷 서점에는 300권의 SQL 관련 국내 서적이 있습니다. 그리고 분야를 SQL-Server 로 좁히면 다시 132권의 검색 결과를 확인할 수 있었습니다. 그 132권의 책을 간추려서 국내 저자가 기술한 책들을 살펴보았습니다. 아쉽게도 예상과는 달리 상당한 비율의 책이 이제는 본사의 기술지원마저도 어려운 구 버전에 대한 내용을 담고 있었습니다. 또한 대다수의 책이 처음 실무에 접하는 초보 개발자와 DBA, 또는 SQL-Server를 처음 접하는 사용자를 위한 책이었습니다. 다행히도 초심자를 위한 책들은 읽기 편하고 적당한 깊이와 지식을 선사해서, 실력을 향상시키기 좋은 책들이 많이 있었습니다. 그리고 학부/대학원에서 사용하는 다양한 해외의 명저들도 높은 품질로 번역되고 출판되어 이제는 영어가 익숙지 않은 분들도 이런 이론서를 쉽게 접할 수 있게 되었습니다.
문제는 초심자 수준에서 벗어난 중급 또는 실무의 핵심 인력들이 볼만한 책들이 생각보다 다양하지 않다는 점입니다. 특히 실무에서 중요한 이슈나 문제가 발생했을 때 막상 참고할 만한 책은 더욱 적습니다. 이러한 이유들로, 이번에 발간하는 SQLTAG의 두 번째 책이 발간된다는 소식을 접했을 때 더욱 반가운 마음이 드나 봅니다. SQLTAG에서 저술한 SQL Server 운영과 튜닝 첫 번째 책이 세상에 나온 지 벌써 2년이 넘었습니다. 그리고 우연히 사내도서관에서 발견한 그 책을 읽으면서 고개를 끄덕끄덕하다 결국 그 책을 구입해서 제 연구실 서재에 꼽아놓게 된 것도 벌써 2년이란 시간이 흘렀습니다.
솔직하게 말해서 이 책은 초보 개발자에게 권할 만한 책은 아닙니다. 초보 개발자들은 확장 이벤트, 커서, tempdb, 고가용성 솔루션 등 아마 목차만 봐도 고개를 갸웃하게 될 내용도 적지 않아 보입니다. 하지만 열심히 공부하고 연구해서 실력을 향상시키고 싶은 개발자들에게 이 책은 가뭄의 단비와도 같은 선물일 거라고 확신합니다. 이 책의 저자들은 현장에서 밤늦게까지 트러블 슈팅으로 뻑뻑해진 눈과 무거운 어깨를 두드리며 모니터와 쿼리의 구석구석을 뚫어지게 바라보는 실무진들입니다. 잦은 야근과 장애 해결로 얼룩진 국내 IT 산업계의 힘든 일상 속에서, 조금이라도 더 나은 지식과 경험을 동료 개발자들에게 전하고 싶은 사명감이 저자들을 뭉치게 만들었고, 그래서 이 책이 세상에 나오게 되었습니다. 책의 내용 대부분이 이론에 그치지 않고 굵직한 국내 최고 수준의 업계에 종사하는 저자들의 실무 경험을 바탕으로 그대로 쓰여진 것도 이 책의 매력적인 부분입니다. 이 책의 예제 스크립트들을 따라 하고 정독을 하면서 실력을 키우는 것도 좋고, 책상 근처 손이 닿는 책꽂이에 꼽아 놓고 필요한 이슈가 발생했을 때 해당 부분을 발췌해서 읽는 것도 많은 도움을 줄 것입니다. 부디 이 책을 통해 조금이라도 여러분의 퇴근 시간이 당겨지길...(하략)

[출판사 제공]  

저자소개

SQLTAG

저자 : SQLTAG
저자 SQLTAG는 'BY DESIGN & BUG 외에 우리가 해결하지 못하는 이슈는 없다!'라는 취지로 현업 DBA, 개발자들이 모여 결성된 스터디 & 컨설팅 그룹이며 온/오프라인으로 여러 DBA, 개발자들과 즐겁게 SQL SERVER를 공부하는 모임입니다. SQL SERVER와 관련된 전반적인 기술과 내부 동작 원리까지 분석하는 등 초급부터 최고급 기술까지 두루 다루고 있으며 전문가들로 구성된 컨설팅 팀이 무료 컨설팅을 수행하고 있습니다.

[인터넷 교보문고 제공]

 

목차

Development & Security
Chapter 01. Paging 진훈식
Chapter 02. Cursor 김상일
Chpater 03. 암호화 윤선식, 이상현, 추숙

Performance
Chpater 04. Perfmon 김경진
Chpater 05. Tempdb 차태욱
Chpater 06. XEvent 김민석
Chpater 07. DMV 한덕우
Chpater 08. Lock 안인옥
Chpater 09. Columnsotre Index 박숙봉

Operation
Chpater 10. Upgrade 이지만, 허상국
Chpater 11. AlwaysOn 강성욱, 고성민, 하만철
Chpater 12. BI 김상수

[예스24 제공]

 

출판사 서평

대표저자 인사말
많은 분들의 도움으로 SQLTAG에서 "SQL Server 운영과 튜닝"이라는 책이 출간되어 많은 사랑을 받았습니다. SQLTAG 회원들 또한 출판에 대한 기쁨과 보람을 느낄 수 있었습니다.
SQLTAG는 "SQL Technical Assistance Group"의 약자로 "우리가 해결하지 못하는 이슈는 없다"라는 취지로 현업 DBA들의 스터디 모임 입니다. SQLTAG 운영은 약 8년동안 지속되고 있으며 70여 명의 DBA들이 정기적으로 모임을 가지며 다양한 활동을 하고 있습니다. 또한 SQLTAG 카페(http://sqltag.org)를 운영하여 온/오프라인으로 정보를 공유하고 있습니다.
SQLTAG의 첫 번째 책인 "SQL Server 운영과 튜닝"에서는 현업에서 발생하는 다수 문제를 공유하고 이를 해결하기 위한 방법과 노하우를 전달하기 위해 많은 노력을 기울였습니다. 책이 출간된 이후 현업의 많은 엔지니어들에게 도움이 되었다는 소식을 들었을 때 보람되었습니다. 또한 SQLTAG 카페는 또 하나의 SQL Server를 운영하는 사람들과의 소통공간으로 발전할 수 있었습니다. 하지만, 수 많은 검증에도 불구하고 일부 오류를 전달한 것과 출판에 대한 경험 부족으로 매끄럽지 못한 구성을 한 것이 집필에 참여한 회원들에게 아쉬움으로 남았습니다.
지난 1권의 출간 이후, 새로운 버전의 SQL Server가 출시되었으며, 많은 기능이 추가 됨에 따라 기술에 대한 연구가 필요함을 느끼게 되었고, 이전에 다루지 못한 내용을 다루기 위해 우리는 다시 모여 책을 쓰게 되었습니다.
이번 집필에는 1권 보다 더 많은 SQLTAG 회원들이 참여 하였습니다. 책을 집필하는 동안 독자들의 입장에서 원하는 부분이 무엇인지에 대해 많은 고민을 하였고, 단순한 기술 정보 전달이 아닌 현업 DBA들의 노하우가 담긴 책으로, 몇 해가 지나도 계속 활용 할 수 있는 그런 책을 쓰기 위해 노력하였습니다.
이번 구성은 "SQL Server 운영과 튜닝"의 내용을 보완하고 새로운 버전에 대한 신기능을 다뤘습니다. 주요 내용으로는 SQL Server 업그레이드, 튜닝, Lock, Xevent, 페이징, tempdb 등 성능과 관련된 내용부터 데이터의 안정성과 서비스 보장을 위한 AlwaysOn 고가용성 그리고 최근 이슈가 되고 있는 보안, 그리고 데이터를 수집, 분석 하기 위한 BI 부분까지 운영의 전반적인 부분을 다루고 있습니다. 내용을 전달하는 과정에서 독자의 이해를 돕기 위해 많은 그림을 활용하였으며, AlwaysOn, SQL Server 업그레이드와 같은 부분은 각 단계별로 실습 할 수 있도록 구성 하였습니다.
더 많은 지식을 나누고 싶었지만, 시간과 지면의 한계로 인하여 좀 더 다양한 내용을 다루지 못한 부분이 아쉬움으로 남습니다. 각자의 파트에 못다 남긴 부분들은 SQLTAG 카페를 통하여 지속적으로 공유 하겠습니다.

먼저 이 책이 나오기까지 수 많은 시간을 함께한 소중한 SQLTAG 멤버들에게 감사의 말을 전하고 싶습니다. 그리고 주말마다 소중한 시간을 허락해 주신 SQLTAG 멤버의 가족분들에게도 감사의 말씀을 드립니다.
이번 출판은 SQLTAG 출판사에서 출판한 첫 책으로 저희에게 큰 의미를 가지고 있습니다. 자체적으로 출판을 하기 위해 출판사를 설립 하고 편집 및 디자인까지 직접하기 위해 SQLTAG 회원의 가족까지 참여하는 프로젝트로 진행 되었습니다. 출판에 도움을 주신 모든 분들께 감사 드립니다.
SQLTAG에서 출간한 "SQL Server 운영과 튜닝" 책의 수익금은 약속한 대로 전액 기부되어 도움이 필요한 곳에 사용되었습니다. 독자들의 사랑과 관심이 좋은 곳에 쓰일 수 있게 되어 감사드립니다.
지금 이 시간에도 작은 회의실에서 서로의 원고를 리뷰하며 더 나은 정보를 전하기 위해 밤을 지새우는 SQLTAG 회원님들 다시 한번 감사드리며 함께 하는 멤버들이 10년 후, 20년 후에도 오늘을 추억하며 술 한잔 기울일 수 있는 SQLTAG를 꿈꾸며, 항상 SQLTAG를 사랑해 주시는 모든 분들께 감사의 말씀을 드립니다.

대표저자 강성욱

추천서
최근 우리 나라도 IT 강국의 대열에 올랐다는 이야기를 많이 합니다.
그리고 여러 다양한 국내외 신문 기사를 보면 그 내용을 뒷받침하는 기사들이 홍수같이 쏟아져서‘IT 강국 코리아’라는 말이 어색하지 않게
느껴집니다. 그래서일까요? 이제는 예전보다 훨씬 더 많은 IT 관련서적을 더 쉽게 접할 수 있는 환경이 되었습니다.
관계형 데이터베이스 분야도 마찬가지인 것 같습니다. 처음 데이터베이스를 공부할 때만 해도, 대학교재와 다양한 기술서적은 대부분 원서였습니다. 국내서적이라고 해도 번역본이 대부분이고, 그마저도 번역의 수준이 상당히 떨어지는 경우가 많아서 차라리 원서가 더 읽기 편한 경우가 많았습니다.
그런데 이제는 상황이 많이 달라진 것 같습니다. 2014년 4월 현재 국내 최대 규모의 인터넷 서점에는 300권의 SQL 관련 국내 서적이 있습니다. 그리고 분야를 SQL-Server 로 좁히면 다시 132권의 검색 결과를 확인할 수 있었습니다. 그 132권의 책을 간추려서 국내 저자가 기술한 책들을 살펴보았습니다. 아쉽게도 예상과는 달리 상당한 비율의 책이 이제는 본사의 기술지원마저도 어려운 구 버전에 대한 내용을 담고 있었습니다.
또한 대다수의 책이 처음 실무에 접하는 초보 개발자와 DBA, 또는 SQL-Server를 처음 접하는 사용자를 위한 책이었습니다.
다행히도 초심자를 위한 책들은 읽기 편하고 적당한 깊이와 지식을 선사해서, 실력을 향상시키기 좋은 책들이 많이 있었습니다. 그리고 학부/
대학원에서 사용하는 다양한 해외의 명저들도 높은 품질로 번역되고 출판되어 이제는 영어가 익숙지 않은 분들도 이런 이론서를 쉽게 접할 수
있게 되었습니다.
문제는 초심자 수준에서 벗어난 중급 또는 실무의 핵심 인력들이 볼만한 책들이 생각보다 다양하지 않다는 점입니다.
특히 실무에서 중요한 이슈나 문제가 발생했을 때 막상 참고할 만한 책은 더욱 적습니다. 이러한 이유들로, 이번에 발간하는 SQLTAG의 두 번째 책이 발간된다는 소식을 접했을 때 더욱 반가운 마음이 드나 봅니다.
SQLTAG에서 저술한 SQL Server 운영과 튜닝 첫 번째 책이 세상에 나온 지 벌써 2년이 넘었습니다.
그리고 우연히 사내도서관에서 발견한 그 책을 읽으면서 고개를 끄덕끄덕하다 결국 그 책을 구입해서 제 연구실 서재에 꼽아놓게 된 것도 벌써
2년이란 시간이 흘렀습니다.
솔직하게 말해서 이 책은 초보 개발자에게 권할 만한 책은 아닙니다. 초보 개발자들은 확장 이벤트, 커서, tempdb, 고가용성 솔루션 등 아마
목차만 봐도 고개를 갸웃하게 될 내용도 적지 않아 보입니다.
하지만 열심히 공부하고 연구해서 실력을 향상시키고 싶은 개발자들에게 이 책은 가뭄의 단비와도 같은 선물일 거라고 확신합니다.
이 책의 저자들은 현장에서 밤늦게까지 트러블 슈팅으로 뻑뻑해진 눈과 무거운 어깨를 두드리며 모니터와 쿼리의 구석구석을 뚫어지게 바라보는 실무진들입니다. 잦은 야근과 장애 해결로 얼룩진 국내 IT 산업계의 힘든 일상 속에서, 조금이라도 더 나은 지식과 경험을 동료 개발자들에게
전하고 싶은 사명감이 저자들을 뭉치게 만들었고, 그래서 이 책이 세상에 나오게 되었습니다.
책의 내용 대부분이 이론에 그치지 않고 굵직한 국내 최고 수준의 업계에 종사하는 저자들의 실무 경험을 바탕으로 그대로 쓰여진 것도 이 책의 매력적인 부분입니다.
이 책의 예제 스크립트들을 따라 하고 정독을 하면서 실력을 키우는 것도 좋고, 책상 근처 손이 닿는 책꽂이에 꼽아 놓고 필요한 이슈가 발생
했을 때 해당 부분을 발췌해서 읽는 것도 많은 도움을 줄 것입니다. 부디 이 책을 통해 조금이라도 여러분의 퇴근 시간이 당겨지길 기원하면서 이 책을 추천하고, 끝으로 새벽까지 실험과 토론을 통해 책의 퀄리티를 향상시키려 노력했던 SQLTAG의 커뮤니티 구성원 및 공동저자분
모두에게 뜨거운 감사의 마음을 전합니다.

NHN NEXT 교수 정호영

출판사의 말

지난 2012년, 영진 출판사를 통해 출판한 [SQL Server 운영과 튜닝]에 이어 SQLTAG의 두 번째 책이 나오게 되었고, 이번 책은 더욱 책임을 갖고 더욱 좋은 내용을 담아 독자들과 공유하고자 자체 출판이라는 큰 도전을 하게 되었습니다.

이 책에서 다루는 내용은, 개발 단계에서 고려할 수 있는 페이징 최적화, 각종 커서를 비롯해 정보 유출 사건 사고로 인해 필요성이 강조된 암호화, 서비스 운영에 필요한 Perfmon, tempdb 최적화, 강력한 도구인 Extend Event. 실무 기반의 DMV와 트랜잭션 & 잠금, SQL Server 2012부터 소개된 Columnstore Indexes를 비롯하여 SQL Server 2012로 Upgrade할 때 고려되어야 하는 내용과 다양한 시나리오. SQL Server 2012의 핵심 고가용 솔루션인 AlwaysOn, 강력한 BI 기능 및 DW 최적화 등 여러 기능에 대한 심도 높은 내용을 최대한 쉽게 다뤘습니다.

찾기 어렵거나 공개되지 않은 깊은 내용까지 다루려다 보니 스터디 회원들 간 열심히 토론하고 공부하여 수치로 검증하였다고는 하지만 그게 ‘정답’이 아닐 수 있습니다. 하지만 저희는 누구보다 열심히 이 책을 위해 열정을 불태웠으며, 혹시라도 잘못된 내용이 있다면 언제든지 같이 고민해볼 수 있으면 좋겠습니다.

책과 스터디에 대한 문의나 의견은 SQLTAG 커뮤니티를 이용해 주시기 바랍니다.
(http://www.sqltag.org 또는 http://cafe.naver.com/sqlmvp)

이 책을 펴내기까지 하루하루 하얗게 불태운 저자분들, 도움 주신 분들과 가족들에게 진심으로 감사드립니다.

SQLTAG 출판사 대표
강산아

[인터넷 교보문고 제공]

 

Posted by ㏈ª ☞ β┖υΕJini.κR


인터넷이 안되는 환경에서 SQL2012 Express  SSMS 설치 Error 해결 방법


Microsoft .NET Framework 4 (Standalone Installer) 설치

http://www.microsoft.com/en-us/download/details.aspx?id=17718

설치 안될때 캡쳐를 못해서... 아래 창에서 설치 되지 않고 install_dotnet_core .. 관련 내용에서 멈추어 있고 설치도 취소도 안되는 현상 ... 우선 강제 종료 후 재부팅 후  프로그램 추가/삭제 에서 SQL 2012 제거하고 위 Net 4 설치 후 재설치 하면 된다.

Posted by ㏈ª ☞ β┖υΕJini.κR

SQL 2000 환경에서 정상적으로 병합 복제가 구성 되었지만 구독자에서 업데이트나 Insert 시

Invalid object name 'ctsv_XXXXX'  Error 발생

1. sp_removedbreplication 를 통해 수정 삭제 하여도 마찬가지 (게시자 및 구독자)

 

 

구독자에서 업데이트 구문을 날리면 개체 없다는 Error 발생

해결 방법 (아래 쿼리를 이용 삭제 복제 관련 SP , VIEW , TRIGGER 조회 후 수동 삭제)

 

sp_configure 'allow updates', 1;

GO

RECONFIGURE WITH OVERRIDE;

GO

BEGIN TRANSACTION;

UPDATE  sysobjects

SET     replinfo = '0'

WHERE   replinfo > '0';

COMMIT TRANSACTION;

GO

sp_configure 'allow updates', 0;

GO

RECONFIGURE WITH OVERRIDE;

GO

 

SELECT  'DROP PROC ' + '[' + ROUTINE_SCHEMA + ']' + '.' + '[' + ROUTINE_NAME

        + ']'

FROM    INFORMATION_SCHEMA.ROUTINES

WHERE   ROUTINE_TYPE = 'PROCEDURE'

        AND ( ROUTINE_NAME LIKE 'sp_sel_%'

              OR ROUTINE_NAME LIKE 'sp_cft_%'

              OR ROUTINE_NAME LIKE 'sp_upd_%'

              OR ROUTINE_NAME LIKE 'sp_ins_%'

            );

 

 

 

 

 

SELECT  'DROP VIEW ' + '[' + name + ']'

FROM    sysobjects

WHERE   xtype = 'V'

        AND ( name LIKE 'ctsv_%'

              OR name LIKE 'tsvw_%'

            );

 

 

 

 

 

SELECT  'DROP TRIGGER ' + '[' + name + ']'

FROM    sysobjects

WHERE   xtype = 'TR'

        AND ( name LIKE 'upd_%'

              OR name LIKE 'del_%'

              OR name LIKE 'ins_%'

            );

 

 



 

Posted by ㏈ª ☞ β┖υΕJini.κR

 

 

  1. [윈도우키] + [R] --> 실행창 열기
  2. notepad %systemroot%\system32\drivers\etc\hosts. -->  엔터
  3. 127.0.0.1 crl.microsoft.com  --> Hosts 파일에 내용 추가 후 저장
  4. SSMS 실행


         
         인터넷 옵션 > Advanced  > Check for publisher’s certificate revocation Disable

 

 

Posted by ㏈ª ☞ β┖υΕJini.κR

 

 



글로벌 관련 DB를 관리 하다 보면  콜레이션 이슈가 가끔 발생 하게 된다. 테이블간의 조인을 해야 하는데 테이블의 컬럼 콜레이션이 잘못 되어 컬럼절에 기준이 되는 컬럼의 콜레이션 변경하여 조인 하는 경우 많은 있었다.

여러나라에서 협업으로 개발하다 보니 콜레이션이 불일치 가는 경우가 발생하여 이번에는 그런 콜레이션 정보를 일일이 찾아 가면서 바꾸는 방법 말고 한꺼번에 바꿀수 있는 방법에 대해서 알아 보고자 한다.

참고 사이트는

http://www.codeproject.com/Articles/302405/The-Easy-way-of-changing-Collation-of-all-Database#

1. 콜레이션을 바꿀려면 PK, FK 를 제거 해야 한다. 하지만 다시 만들어야 하기 때문에 notepad 나 에디터 툴로 파일로 저장 해두어야 한다. 저장을 하기 위한 CreateCreateTableKeys SP 를 통해 스크립트를 저장 하도록 한다.

* 콜레이션 변경 후 생성에 사용할  PK, FK 스크립트 생성

 

/*

Script Table Keys

(C) 2010 Adam Machanic - amachanic@gmail.com

http://sqlblog.com/blogs/adam_machanic/archive/2010/04/04/

       rejuvinated-script-creates-and-drops-for-candidate-keys

       -and-referencing-foreign-keys.aspx

This script produces a script of all of the candidate keys (primary keys or unique

constraints) as well as referencing foreign keys, for the target table. To use, put

SSMS into "results in text" mode and run the script. The output will be a formatted

script that you can cut and paste to use elsewhere.

 

Don't forget to configure the maximum text size before using. The default is 256

characters--not enough for many cases.

 

Tools->Options->Query Results->Results to Text->Maximum number of characters->8192

*/

CREATE PROC [dbo].[ScriptCreateTableKeys]

    @table_name SYSNAME

AS

BEGIN

    SET NOCOUNT ON

 

    --Note: Disabled keys and constraints are ignored

    --TODO: Drop and re-create referencing XML indexes, FTS catalogs

 

    DECLARE @crlf CHAR(2)

    SET @crlf = CHAR(13) + CHAR(10)

    DECLARE @version CHAR(4)

    SET @version = SUBSTRING(@@VERSION, LEN('Microsoft SQL Server') + 2, 4)

    DECLARE @object_id INT

    SET @object_id = OBJECT_ID(@table_name)

    DECLARE @sql NVARCHAR(MAX)

 

    IF @version NOT IN ('2005', '2008')

    BEGIN

        RAISERROR('This script only supports SQL Server 2005 and 2008', 16, 1)

        RETURN

    END

 

    SET @sql = '' +

        'SELECT ' +

            'CASE ' +

                'WHEN 1 IN (i.is_primary_key, i.is_unique_constraint) THEN ' +

                    '''ALTER TABLE '' + ' +

                        'QUOTENAME(OBJECT_SCHEMA_NAME(i.object_id)) + ''.'' + ' +

                        'QUOTENAME(OBJECT_NAME(i.object_id)) + @crlf + ' +

                    '''ADD '' + ' +

                        'CASE k.is_system_named ' +

                            'WHEN 0 THEN ''CONSTRAINT '' + QUOTENAME(k.name) + @crlf ' +

                            'ELSE '''' ' +

                        'END + ' +

                    'CASE k.type ' +

                        'WHEN ''UQ'' THEN ''UNIQUE'' ' +

                        'ELSE ''PRIMARY KEY'' ' +

                    'END + '' '' + ' +

                    'i.type_desc  + @crlf + ' +

                    'kc.key_columns + @crlf ' +

                'ELSE ' +

                    '''CREATE UNIQUE '' + i.type_desc + '' INDEX '' + ' +

                        'QUOTENAME(i.name) + @crlf + ' +

                    '''ON '' + ' +

                        'QUOTENAME(OBJECT_SCHEMA_NAME(i.object_id)) + ''.'' + ' +

                        'QUOTENAME(OBJECT_NAME(i.object_id)) + @crlf + ' +

                    'kc.key_columns + @crlf + ' +

                    'COALESCE ' +

                    '( ' +

                        '''INCLUDE '' + @crlf + ' +

                        '''( '' + @crlf + ' +

                            'STUFF ' +

                            '( ' +

                                '( ' +

                                    'SELECT ' +

                                    '( ' +

                                        'SELECT ' +

                                            ''','' + @crlf + '' '' + QUOTENAME(c.name) AS [text()] ' +

                                        'FROM sys.index_columns AS ic ' +

                                        'JOIN sys.columns AS c ON ' +

                                            'c.object_id = ic.object_id ' +

                                            'AND c.column_id = ic.column_id ' +

                                        'WHERE ' +

                                            'ic.object_id = i.object_id ' +

                                            'AND ic.index_id = i.index_id ' +

                                            'AND ic.is_included_column = 1 ' +

                                        'ORDER BY ' +

                                            'ic.key_ordinal ' +

                                        'FOR XML PATH(''''), TYPE ' +

                                    ').value(''.'', ''VARCHAR(MAX)'') ' +

                                '), ' +

                                '1, ' +

                                '3, ' +

                                ''''' ' +

                            ') + @crlf + ' +

                        ''')'' + @crlf, ' +

                        ''''' ' +

                    ') ' +

            'END + ' +

            '''WITH '' + @crlf + ' +

            '''('' + @crlf + ' +

                ''' PAD_INDEX = '' + ' +

                        'CASE CONVERT(VARCHAR, i.is_padded) ' +

                            'WHEN 1 THEN ''ON'' ' +

                            'ELSE ''OFF'' ' +

                        'END + '','' + @crlf + ' +

                'CASE i.fill_factor ' +

                    'WHEN 0 THEN '''' ' +

                    'ELSE ' +

                        ''' FILLFACTOR = '' + ' +

                                'CONVERT(VARCHAR, i.fill_factor) + '','' + @crlf ' +

                'END + ' +

                ''' IGNORE_DUP_KEY = '' + ' +

                        'CASE CONVERT(VARCHAR, i.ignore_dup_key) ' +

                            'WHEN 1 THEN ''ON'' ' +

                            'ELSE ''OFF'' ' +

                        'END + '','' + @crlf + ' +

                ''' ALLOW_ROW_LOCKS = '' + ' +

                        'CASE CONVERT(VARCHAR, i.allow_row_locks) ' +

                            'WHEN 1 THEN ''ON'' ' +

                            'ELSE ''OFF'' ' +

                        'END + '','' + @crlf + ' +

                ''' ALLOW_PAGE_LOCKS = '' + ' +

                        'CASE CONVERT(VARCHAR, i.allow_page_locks) ' +

                            'WHEN 1 THEN ''ON'' ' +

                            'ELSE ''OFF'' ' +

                        'END + ' +

                CASE @version

                    WHEN '2005' THEN ''

                    ELSE            

                        ''','' + @crlf + ' +

                        ''' DATA_COMPRESSION = '' + ' +

                            '( ' +

                                'SELECT ' +

                                    'CASE ' +

                                        'WHEN MIN(p.data_compression_desc) =

                                          MAX(p.data_compression_desc)

                                          THEN MAX(p.data_compression_desc) ' +

                                          'ELSE ''[PARTITIONS USE

                                          MULTIPLE COMPRESSION TYPES]'' ' +

                                    'END ' +

                                'FROM sys.partitions AS p ' +

                                'WHERE ' +

                                    'p.object_id = i.object_id ' +

                                    'AND p.index_id = i.index_id ' +

                            ') '

                END + '+ @crlf + ' +

            ''') '' + @crlf + ' +

            '''ON '' + ds.data_space + '';'' + ' +

                '@crlf + @crlf COLLATE database_default AS [-- Create Candidate Keys] ' +

        'FROM sys.indexes AS i ' +

        'LEFT OUTER JOIN sys.key_constraints AS k ON ' +

            'k.parent_object_id = i.object_id ' +

            'AND k.unique_index_id = i.index_id ' +

        'CROSS APPLY ' +

        '( ' +

            'SELECT ' +

                '''( '' + @crlf + ' +

                    'STUFF ' +

                    '( ' +

                        '( ' +

                            'SELECT ' +

                            '( ' +

                                'SELECT ' +

                                    ''','' + @crlf + '' '' + QUOTENAME(c.name) AS [text()] ' +

                                'FROM sys.index_columns AS ic ' +

                                'JOIN sys.columns AS c ON ' +

                                    'c.object_id = ic.object_id ' +

                                    'AND c.column_id = ic.column_id ' +

                                'WHERE ' +

                                    'ic.object_id = i.object_id ' +

                                    'AND ic.index_id = i.index_id ' +

                                    'AND ic.key_ordinal > 0 ' +

                                'ORDER BY ' +

                                    'ic.key_ordinal ' +

                                'FOR XML PATH(''''), TYPE ' +

                            ').value(''.'', ''VARCHAR(MAX)'') ' +

                        '), ' +

                        '1, ' +

                        '3, ' +

                        ''''' ' +

                    ') + @crlf + ' +

                ''')'' ' +

        ') AS kc (key_columns) ' +

        'CROSS APPLY ' +

        '( ' +

            'SELECT ' +

                'QUOTENAME(d.name) + ' +

                    'CASE d.type ' +

                        'WHEN ''PS'' THEN ' +

                            '+ ' +

                            '''('' + ' +

                                '( ' +

                                    'SELECT ' +

                                        'QUOTENAME(c.name) ' +

                                    'FROM sys.index_columns AS ic ' +

                                    'JOIN sys.columns AS c ON ' +

                                        'c.object_id = ic.object_id ' +

                                        'AND c.column_id = ic.column_id ' +

                                    'WHERE ' +

                                        'ic.object_id = i.object_id ' +

                                        'AND ic.index_id = i.index_id ' +

                                        'AND ic.partition_ordinal = 1 ' +

                                ') + ' +

                            ''')'' ' +

                        'ELSE '''' ' +

                    'END ' +

            'FROM sys.data_spaces AS d ' +

            'WHERE ' +

                'd.data_space_id = i.data_space_id ' +

        ') AS ds (data_space) ' +

        'WHERE ' +

            'i.object_id = @object_id ' +

            'AND i.is_unique = 1 ' +

            --filtered and hypothetical indexes cannot be candidate keys

            CASE @version

                WHEN '2008' THEN 'AND i.has_filter = 0 '

                ELSE ''

            END +

            'AND i.is_hypothetical = 0 ' +

            'AND i.is_disabled = 0 ' +

        'ORDER BY ' +

            'i.index_id '

 

    EXEC sp_executesql

@sql,

        N'@object_id INT, @crlf CHAR(2)',

        @object_id, @crlf

 

    SELECT

        'ALTER TABLE ' +

            QUOTENAME(OBJECT_SCHEMA_NAME(fk.parent_object_id)) + '.' +

            QUOTENAME(OBJECT_NAME(fk.parent_object_id)) + @crlf +

        CASE fk.is_not_trusted

            WHEN 0 THEN 'WITH CHECK '

            ELSE 'WITH NOCHECK '

        END +

            'ADD ' +

                CASE fk.is_system_named

                    WHEN 0 THEN 'CONSTRAINT ' + QUOTENAME(name) + @crlf

                    ELSE ''

                END +

        'FOREIGN KEY ' + @crlf +

        '( ' + @crlf +

            STUFF

(

(

                    SELECT

(

                        SELECT

                            ',' + @crlf + ' ' + QUOTENAME(c.name) AS [text()]

                        FROM sys.foreign_key_columns AS fc

                        JOIN sys.columns AS c ON

                            c.object_id = fc.parent_object_id

                            AND c.column_id = fc.parent_column_id

                        WHERE

                            fc.constraint_object_id = fk.object_id

                        ORDER BY

                            fc.constraint_column_id

                        FOR XML PATH(''), TYPE

                    ).value('.', 'VARCHAR(MAX)')

                ),

                1,

                3,

                ''

            ) + @crlf +

        ') ' +

        'REFERENCES ' +

            QUOTENAME(OBJECT_SCHEMA_NAME(fk.referenced_object_id)) + '.' +

            QUOTENAME(OBJECT_NAME(fk.referenced_object_id)) + @crlf +

        '( ' + @crlf +

            STUFF

(

(

                    SELECT

(

                        SELECT

                            ',' + @crlf + ' ' + QUOTENAME(c.name) AS [text()]

                        FROM sys.foreign_key_columns AS fc

                        JOIN sys.columns AS c ON

                            c.object_id = fc.referenced_object_id

                            AND c.column_id = fc.referenced_column_id

                        WHERE

                            fc.constraint_object_id = fk.object_id

                        ORDER BY

                            fc.constraint_column_id

                        FOR XML PATH(''), TYPE

                    ).value('.', 'VARCHAR(MAX)')

                ),

                1,

                3,

                ''

            ) + @crlf +

        ');' +

            @crlf + @crlf COLLATE database_default AS [-- Create Referencing FKs]

    FROM sys.foreign_keys AS fk

    WHERE

        referenced_object_id = @object_id

        AND is_disabled = 0

    ORDER BY

        key_index_id

 

END 

* 생성한 스크립트를 활용 하여 백업

혹시 Results To TEXT 시 한 ROW 의 행이 255 가 넘을수있기 때문에 옵션을 먼저 변경 하고 아래 쿼리를 실행 한다.

 

* SSMS 에서  Ctrl+T 실행 한 후 아래 커서를 실행 한다.

 
DECLARE @TableName nvarchar(255)

DECLARE MyTableCursor Cursor

FOR

SELECT name FROM sys.tables WHERE [type] = 'U' and name <> 'sysdiagrams' ORDER BY name

OPEN MyTableCursor

 

FETCH NEXT FROM MyTableCursor INTO @TableName

WHILE @@FETCH_STATUS = 0

    BEGIN

    EXEC dbo.ScriptCreateTableKeys @TableName

 

    FETCH NEXT FROM MyTableCursor INTO @TableName

END

CLOSE MyTableCursor

DEALLOCATE MyTableCursor 

 

콜레이션 변경 후 다시 만들어야 하는 PK,FK 을 위해 아래 Results To Text 를 저장 한다.

2. PK , FK 제거 스크립트를 생성 하고 Results To Text  결과 값으로 PK, FK 를 제거 한다.

* 콜레이션 변경 전 PK, FK 제거에 사용할 스크립트 생성

 

CREATE PROC [dbo].[ScriptDropTableKeys]

    @table_name SYSNAME

AS

BEGIN

    SET NOCOUNT ON

 

    --Note: Disabled keys and constraints are ignored

    --TODO: Drop and re-create referencing XML indexes, FTS catalogs

 

    DECLARE @crlf CHAR(2)

    SET @crlf = CHAR(13) + CHAR(10)

    DECLARE @version CHAR(4)

    SET @version = SUBSTRING(@@VERSION, LEN('Microsoft SQL Server') + 2, 4)

    DECLARE @object_id INT

    SET @object_id = OBJECT_ID(@table_name)

    DECLARE @sql NVARCHAR(MAX)

 

    IF @version NOT IN ('2005', '2008')

    BEGIN

        RAISERROR('This script only supports SQL Server 2005 and 2008', 16, 1)

        RETURN

    END

 

    SELECT

        'ALTER TABLE ' +

            QUOTENAME(OBJECT_SCHEMA_NAME(parent_object_id)) + '.' +

            QUOTENAME(OBJECT_NAME(parent_object_id)) + @crlf +

        'DROP CONSTRAINT ' + QUOTENAME(name) + ';' +

            @crlf + @crlf COLLATE database_default AS [-- Drop Referencing FKs]

    FROM sys.foreign_keys

    WHERE

        referenced_object_id = @object_id

        AND is_disabled = 0

    ORDER BY

        key_index_id DESC

 

    SET @sql = '' +

        'SELECT ' +

            'statement AS [-- Drop Candidate Keys] ' +

        'FROM ' +

        '( ' +

            'SELECT ' +

                'CASE ' +

                    'WHEN 1 IN (i.is_unique_constraint, i.is_primary_key) THEN ' +

                        '''ALTER TABLE '' + ' +

                            'QUOTENAME(OBJECT_SCHEMA_NAME(i.object_id)) + ''.'' + ' +

                            'QUOTENAME(OBJECT_NAME(i.object_id)) + @crlf + ' +

                        '''DROP CONSTRAINT '' + QUOTENAME(i.name) + '';'' + ' +

                            '@crlf + @crlf COLLATE database_default ' +

                    'ELSE ' +

                        '''DROP INDEX '' + QUOTENAME(i.name) + @crlf + ' +

                        '''ON '' + ' +

                            'QUOTENAME(OBJECT_SCHEMA_NAME(object_id)) + ''.'' + ' +

                            'QUOTENAME(OBJECT_NAME(object_id)) + '';'' + ' +

                                '@crlf + @crlf COLLATE database_default ' +

                'END AS statement, ' +

                'i.index_id ' +

            'FROM sys.indexes AS i ' +

            'WHERE ' +

                'i.object_id = @object_id ' +

                'AND i.is_unique = 1 ' +

                --filtered and hypothetical indexes cannot be candidate keys

                CASE @version

                    WHEN '2008' THEN 'AND i.has_filter = 0 '

                    ELSE ''

                END +

                'AND i.is_hypothetical = 0 ' +

                'AND i.is_disabled = 0 ' +

        ') AS x ' +

        'ORDER BY ' +

            'index_id DESC '

 

    EXEC sp_executesql

@sql,

        N'@object_id INT, @crlf CHAR(2)',

        @object_id, @crlf

 

END

* 커서를 사용 하여 삭제 스크립트 추출

 

 

DECLARE @TableName nvarchar(255)

DECLARE MyTableCursor Cursor

FOR

SELECT name FROM sys.tables WHERE [type] = 'U' and name <> 'sysdiagrams' ORDER BY name

OPEN MyTableCursor

 

FETCH NEXT FROM MyTableCursor INTO @TableName

WHILE @@FETCH_STATUS = 0

    BEGIN

     EXEC ScriptDropTableKeys @TableName

 

    FETCH NEXT FROM MyTableCursor INTO @TableName

END

CLOSE MyTableCursor

DEALLOCATE MyTableCursor 

 

* 복사한 스크립트를 활용 하여 PK , FK 제거

 

3. 변경 하고자 하는 콜레이션으로 변경

 declare @TableName Nvarchar(4000),

                @ColumnName Nvarchar(4000),

                @CharacterMaxLen Nvarchar(4000),

                @CollationName Nvarchar(4000),

                @IsNullable Nvarchar(4000),

                @DataType Nvarchar(4000),

                @SQLText Nvarchar(4000)

 

SET @CollationName = 'Latin1_General_CI_AS'

 

declare MyTableCursor cursor for

                SELECT name FROM sys.Tables

 

OPEN MyTableCursor

FETCH NEXT FROM MyTableCursor INTO @TableName

WHILE @@FETCH_STATUS = 0

    BEGIN

        DECLARE MyColumnCursor Cursor

        FOR

        SELECT COLUMN_NAME,DATA_TYPE, CHARACTER_MAXIMUM_LENGTH,

            IS_NULLABLE from information_schema.columns

            WHERE table_name = @TableName AND  (Data_Type LIKE '%char%'

            OR Data_Type LIKE '%text%') AND COLLATION_NAME <> @CollationName

            ORDER BY ordinal_position

        Open MyColumnCursor

 

        FETCH NEXT FROM MyColumnCursor INTO @ColumnName, @DataType,

              @CharacterMaxLen, @IsNullable

        WHILE @@FETCH_STATUS = 0

            BEGIN

            SET @SQLText = 'ALTER TABLE ' + @TableName + ' ALTER COLUMN [' + @ColumnName + '] ' +

              @DataType + '(' + CASE WHEN @CharacterMaxLen = -1 THEN 'MAX' ELSE @CharacterMaxLen END +

              ') COLLATE ' + @CollationName + ' ' +

              CASE WHEN @IsNullable = 'NO' THEN 'NOT NULL' ELSE 'NULL' END

            PRINT @SQLText

 

                                                FETCH NEXT FROM MyColumnCursor INTO @ColumnName, @DataType,

                                                                  @CharacterMaxLen, @IsNullable

        END

        CLOSE MyColumnCursor

        DEALLOCATE MyColumnCursor

 

FETCH NEXT FROM MyTableCursor INTO @TableName

END

CLOSE MyTableCursor

DEALLOCATE MyTableCursor

 * Results To Text 의 내용을 복사 하여 콜레이션 변경

4. 1번의 백업해 놓은 Create PK , FK 를 사용 하여 PK, FK 생성

 

 

Posted by ㏈ª ☞ β┖υΕJini.κR

 



갑작스런  TEMPDB 의 데이터 파일 증가로 인해 용량이 부족시...

 


-- DATABASE MDF 파일 축소 시도 (DB 정보로는 99% 축소 가능으로 보임)

 

USE [tempdb]

GO

dbcc shrinkfile (tempdev,10240)

-- 축소 되지 않음


--프로시저 캐시
DBCC FREEPROCCACHE
GO


-- Buffer Pool에 존재하는 데이터 페이지를 제거
DBCC DROPCLEANBUFFERS
Go


--사용 하지 않는 모든 캐시 삭제
DBCC FREESYSTEMCACHE ('ALL')
GO

--분산 쿼리에서 Microsoft SQL Server 인스턴스에 대해 사용한 분산 쿼리 연결 캐시를 플러시 DBCC FREESESSIONCACHE
GO

dbcc shrinkfile (tempdev,10240)
GO

Posted by ㏈ª ☞ β┖υΕJini.κR

 

 

 

 

여러 서버의 고유 값을 만들때 유용 할듯 합니다.

 

Windows가 시작된 이후에 지정한 컴퓨터에서 이 함수가 이전에 생성한 모든 GUID보다 큰 GUID를 만듭니다. Windows를 다시 시작한 후 GUID가 더 낮은 범위에서 다시 시작될 수 있지만 여전히 전역적으로 고유합니다. GUID 열이 행 식별자로 사용되는 경우 NEWSEQUENTIALID를 사용하면 NEWID 함수를 사용할 때보다 더 빠를 수 있습니다. 그 이유는 NEWID 함수의 경우 임의 작업이 발생하고 캐시된 데이터 페이지를 거의 사용하지 않기 때문입니다. 또한 NEWSEQUENTIALID를 사용하면 데이터 및 인덱스 페이지를 완전히 채울 수 있습니다.

 

CREATE TABLE myTable (ColumnA uniqueidentifier DEFAULT NEWSEQUENTIALID())

NEWSEQUENTIALID()를 사용하여 생성된 각 GUID는 해당 컴퓨터에서 고유합니다. NEWSEQUENTIALID()를 사용하여 생성된 GUID는 원본 컴퓨터에 네트워크 카드가 있는 경우에만 여러 컴퓨터에서 고유합니다. GUID에 대한 자세한 내용은 uniqueidentifier 데이터 사용을 참조하십시오.

 

Posted by ㏈ª ☞ β┖υΕJini.κR

SELECT  [Table Name] = OBJECT_NAME(c.object_id) ,

        [Column Name] = c.name ,

        [Description] = ex.value

FROM    sys.columns c

        LEFT OUTER JOIN sys.extended_properties ex ON ex.major_id = c.object_id

                                                      AND ex.minor_id = c.column_id

                                                      AND ex.name = 'MS_Description'

WHERE   OBJECTPROPERTY(c.object_id, 'IsMsShipped') = 0

        AND OBJECT_NAME(c.object_id) = '테이블명'

ORDER BY OBJECT_NAME(c.object_id) ,

        c.column_id

 

Posted by ㏈ª ☞ β┖υΕJini.κR

퇴근 할려는데 카톡으로 쿼리로 SP 주석 제거 할 수 있는 방법 물어 보길래 한번

 

만들어 봤습니다.

SELECT  REPLACE(ss.definition,

                SUBSTRING(ss.definition, CHARINDEX('/*', ss.definition) - 2,

                          CHARINDEX('*/', ss.definition) + 4 - CHARINDEX('/*',

                                                              ss.definition)),

                '') AS  [주석제거SP],

        ss.definition  [기존SP]

FROM    Admin.sys.objects AS so

        INNER JOIN Admin.sys.sql_modules AS ss ON so.object_id = ss.object_id

WHERE   so.schema_id = 1

        AND type = 'P'

        AND ss.definition LIKE '%/*%'


 

Posted by ㏈ª ☞ β┖υΕJini.κR

 

 

RECOVERY PENDING

  • The database will be in this state if SQL Server knows that recovery needs to be run on the database but something is preventing recovery from starting. This is different from SUSPECT because there's nothing to say that recovery is going to fail - it just hasn't started yet.
  • An example of this is when the database wasn't cleanly shut down (i.e. there was at least one uncommitted transaction active at the time the database was shut down) and the log file has been deleted

RECOVERY PENDING 상태는  트랜잭션 로그 파일의 변형이나 손상으로 발생 한다고 합니다. 이런 일이 어제 발생하고 말았네요. 선거를 무사히 마치고 출근을 위해 잘려고 하는데 미국 본사에 급하게 연락와 DB 상태 확인해보니 RECOVERY PENDING 상태 였습니다. 것도 2개의 DB 가 ^^

 


시스템 환경
Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600 Enterprise Edition (64-bit)

해결 방법

1. 트랜잭션 로그 리빌드 (기존 Log 파일을 다른 이름으로 변경하거나 복사 해놓았아야 합니다.)

ALTER DATABASE COFE REBUILD LOG ON (NAME=COFE_Log, FILENAME='D:\SQLDATA\COFE_log.ldf') 

Warning: The log for database 'COFE' has been rebuilt. Transactional consistency has been lost. The RESTORE chain was broken, and the server no longer has context on the previous log files, so you will need to know what they were. You should run DBCC CHECKDB to validate physical consistency. The database has been put in dbo-only mode. When you are ready to make the database available for use, you will need to reset database options and delete any extra log files.

경고: 데이터베이스 'COFE'의 로그가 다시 작성되었습니다. 트랜잭션에 일관성이 없습니다. RESTORE 체인이 끊어져 서버에 이전 로그 파일에 대한 컨텍스트가 더 이상 없으므로 해당 로그 파일이 어떤 파일인지 알아야 합니다. DBCC CHECKDB를 실행하여 물리적 일관성을 확인해야 합니다. 데이터베이스가 dbo 전용 모드로 전환되었습니다. 데이터베이스를 사용할 수 있는 준비가 되면 데이터베이스 옵션을 다시 설정하고 모든 추가 로그 파일을 삭제하십시오.

트랜잭션 로그 리빌드 후 Restricted User 로 변경 된 것을 볼수 있다.

2. 데이터베이스 CHECKDB 를 통한 일관성 오류 검사

DBCC CHECKDB('COFE')

3. Mode 변경 

ALTER DATABASE COFE SET MULTI_USER

2번에서 일관성 오류가 난다면  문제의 Object_ID 나 에러 발생 난 곳에 테이블 명을 알수 있을 것이다. 

SELECT
  OBJECT_NAME(12313214) 

테이블 확인 후

DBCC
checktable(table)

checktable 을 통해 에러를 재확인 한다.

데이터베이스 유저 모드를 싱글로 변경 하고

ALTER DATABASE COFE SET SINGLE_USER

go

DBCC checktable(table, repair_rebuild)

go

 

후에도 계속 에러나 난다면 아래를 실행을 고려해야 합니다.

DBCC checktable(table, repair_allow_data_loss)

go


DBCC checktable 의 옵션에 REPAIR_FAST ,REPAIR_REBUILD ,REPAIR_ALLOW_DATA_LOSS
3가지 있습니다.

REPAIR_FAST or REPAIR_REBUILD 먼저 해보고 REPAIR_ALLOW_DATA_LOSS 로 하십시오.

그리고 REPAIR_ALLOW_DATA_LOSS 는 데이터 손실이 일어 날수 있음을 인지하고 계셔야 합니다.

 

 

Posted by ㏈ª ☞ β┖υΕJini.κR

증상

전세계 여러매장에서 대략 5000여대의 POS 를 사용하고 있다.

각각의 POS 는 SQL Server 2000 Personal Edition 설치 되어 있다. 각 매장마다 판매 및 상품의 데이터를 공유하기 위해 매장 별로 Merge Replication 을 사용하고 있는 구조다.

이렇게 많은 POS 의 재설치시 설치 시간을 단축하기 위해 Ghost 를 사용한다. 기본 Base Server 가 아니라 이미 사용중인 특정 서버를 Ghost 로 떠서 기존에 사용중인 Replication 정보가 저장 되어 있다.  Merge Replication 를 재구성 할려고 하거나 EM 게시자에서 DELETE 를 통해 Replication 를 제거 할려고 하면 Error 가 발생한다. 그리고 Replication 으로 인해 Services Pack 업데이트로 안되는 상황 이었다.  이런 경우 Merge  Replication 정보를 어떻게 지워야 할까?

EM 을 통한 Replication 제거 시도

 

 

위와 같은 Error 로 인해 제거가 되지 않는다. 이 오류는 Server HostName 이 실제 서버 이름과 틀려 발생하는 문제이다.

그럼 서버의 Hostname 은 어떻게 되어있는지 확인해 보자.

--만약 cmdshell 이 실행이 안될때 아래 명령을 통해 활성화 해야 한다.   
--EXEC sp_configure 'show advanced options', 1
--GO
--RECONFIGURE
--GO

--서버이름가져오기
EXEC master.dbo.xp_cmdshell 'hostname'

실행 결과를 통해 이서버의 HostName XXX22  라는걸 알수 있다.

 
그럼 실제로 SQL Server 에 설정되어 있는 HostName 은 어떻게 되어 있을까?

SP_HELPSERVER

 

위 결과와 같이 XXXUK01 로 HostName 이 설정 되어 있는 있는걸 볼수 있다.

그리고 Base Server 가 아닌 다른 서버의 Ghost 정보로 복원을 하여 XXXUK02~04 , 그리고 repl_distributor 도 등록되어 있는걸 볼수 있다.

이럼 이걸 어떻게 제거 할까?

우선 서버 Hostname 변경으로 잘못된 서버를 가리키고 있는 JOB 을 비롯한  Replication 관련 JOB 의 서버 정보를 변경 한다.

USE msdb

GO

DECLARE @server sysname

SET @server = CAST(SERVERPROPERTY('ServerName')AS sysname)

UPDATE sysjobs

SET originating_server = @server

WHERE originating_server <> CAST(SERVERPROPERTY('ServerName')AS sysname)

그럼 이제 잘못 구성되어 있는 복제를 제거 하도록 해보자 ..

EM 에서 제거시 이전 처럼 Error 화면이 발생하지 않지만 게시자 DB 는 아직 Replication 으 구성되어 있다고 나온다.

그래서 아래 쿼리를 통해 게시자를 제거 하도록 한다.
sp_removedbreplication 'A디비'


다음으로 배포를 해제 합니다.
sp_dropdistributor @no_checks=1, @ignore_distributor=1


The Subscriber was dropped.

The Subscriber was dropped.

The Subscriber was dropped.

Deleting database file 'C:\Program Files\Microsoft SQL Server\MSSQL\Data\distribution.LDF'.

Deleting database file 'C:\Program Files\Microsoft SQL Server\MSSQL\Data\distribution.MDF'.

Login dropped.

Msg 15009, Level 16, State 1, Procedure sp_procoption, Line 47

The object 'sp_MSrepl_startup' does not exist in database 'msdb'.

위와 같은  에러가 발생 하지만 Replication 관련 인듯 하여 무시 하였다.

DM 에서 확인해보면 이렇게 적용 후 게시 관련 DB 에 Replication 구성이 되어 있다는 손 모양이나 배포자 DB 가 제거 된것을 확인 할수 있다.

Replication 재구성을 위해 잘못된 서버 이름들을 제거 하고 이서버에 맞게 서버 이름을 변경 하도록 한다.

sp_dropserver 'XXXUK01'

GO

sp_addserver XXX22,LOCAL

 

sp_dropserver 'XXXUK02'

GO

sp_dropserver 'XXXUK03'

GO

sp_dropserver 'XXXUK04'

GO

위와 같은 형식으로 제거 한다. repl_distributor 의 경우 sp_dropdistributor 를 통해 배포자 DB 와 함께 제거 되었다.

그리고 다시

SP_HELPSERVER 해보면

잘못된 서버명이 정상적으로 변경 된것을 확인 할수 있다.


 



 

Posted by ㏈ª ☞ β┖υΕJini.κR


[원문] http://www.sqlservercentral.com/articles/.Net/94922/

해외 사이트에서 다이나믹 피벗을 CLR 로 만든걸 보고 한번 테스트 해보았습니다. 피벗을 좀더 쉽게 사용 할수 있습니다.

성능은 장담 못하지만 ^^

소스 파일

DynamicPivot.cs

컴파일 한 DLL 파일

DynamicPivot.dll



DynamicPivot.cs

using System;

using System.Collections;

using System.Collections.Generic;

using System.Data.SqlClient;

using System.Data;

using System.Data.SqlTypes;

using Microsoft.SqlServer.Server;

 

namespace Syx.Functions

{

    public partial class UserDefindedFunctions

    {

        [Microsoft.SqlServer.Server.SqlProcedure(Name="clrDynamicPivot")]

        public static void clrDynamicPivot(SqlString query, SqlString pivotColumn, SqlString selectCols, SqlString aggCols, SqlString orderBy)

        {

            string stmt = string.Empty;

            try

            {

                CreateTempTable(query);

                string pivot = GetPivotData(pivotColumn.ToString());

                stmt = string.Format("select * from ( select {0} from #temp ) as t pivot ( {1} for {2} in ( {3} )) as p {4}",

                    selectCols.ToString(),

                    aggCols.ToString(),

                    pivotColumn.ToString(),

                    pivot,

                    orderBy.ToString());

                using (SqlConnection cn = new SqlConnection("Context Connection=True"))

                {

                    SqlCommand cmd = cn.CreateCommand();

                    cmd.CommandText = stmt;

                    cn.Open();

                    SqlDataReader reader = cmd.ExecuteReader();

                    SqlContext.Pipe.Send(reader);

                }

 

            }

            catch (Exception ex)

            {

                throw new Exception(string.Format("clrDynamicPivot Error stmt:{0}", stmt), ex);

            }

        }

 

        public static void CreateTempTable(SqlString query)

        {

            using (SqlConnection sqlconn = new SqlConnection("Context Connection=True"))

            {

                SqlCommand sqlCmd = sqlconn.CreateCommand();

                sqlCmd.CommandText = query.ToString();

                sqlconn.Open();

                sqlCmd.ExecuteNonQuery();

            }

        }

 

        public static string GetPivotData(string pivotColumn)

        {

            string stmt = string.Format("select distinct {0} from #temp", pivotColumn);

            string pivotCols = string.Empty;

 

            using (SqlConnection cn = new SqlConnection("Context Connection=True"))

            {

                SqlCommand cmd = cn.CreateCommand();

                cmd.CommandText = stmt;

                cn.Open();

                using (SqlDataReader dr = cmd.ExecuteReader())

                {

                    while (dr.Read())

                    {

                        if (dr.GetFieldType(0) == typeof(System.Int32))

                            pivotCols += "[" + dr.GetInt32(0) + "],";

                        if (dr.GetFieldType(0) == typeof(System.Decimal))

                            pivotCols += "[" + dr.GetDecimal(0) + "],";

                        if (dr.GetFieldType(0) == typeof(System.String))

                            pivotCols += "[" + dr.GetString(0) + "],";

                    }

                }

            }

            return pivotCols.Remove(pivotCols.Length - 1);

        }

    }

}

 

 

DynamicPivot.cs C# 소스를 컴파일하여 DynamicPivot.dll 로 만듭니다.

생성된 DynamicPivot.dll  SSMS 에서 실행 합니다.

1. CLR 활성화 및 ASSEMBLY 등록 합니다.


SET NOCOUNT ON
;
USE master;
EXEC sp_configure 'clr enabled', 1
;
RECONFIGURE;
GO

USE TEST

GO

 

CREATE ASSEMBLY DynamicPivot  FROM 'D:\DynamicPivot.dll'

WITH PERMISSION_SET = SAFE

 

go


2. 프로시저를 만듭니다.

CREATE PROC usp_clrDynamicPivot

    @query AS NVARCHAR(4000) ,

    @pivotColumn AS NVARCHAR(4000) ,

    @selectCols AS NVARCHAR(4000) ,

    @aggCols AS NVARCHAR(4000) ,

    @orderBy AS NVARCHAR(4000)

AS EXTERNAL NAME

    DynamicPivot.[Syx.Functions.UserDefindedFunctions].clrDynamicPivot

 

3. 테스트 데이터 생성 합니다.

CREATE TABLE [dbo].[Orders]

    (

      [OrderID] [int] NOT NULL ,

      [ProductID] [int] NOT NULL ,

      [Quantity] [int] NOT NULL ,

      [OriginState] [nvarchar](2) NOT NULL

    )

GO

 

4. 데이터 입력 TEST #첫번째

INSERT INTO Orders VALUES (1, 10, 2, 'AA')

INSERT INTO Orders VALUES (2, 11, 1, 'BB')

INSERT INTO Orders VALUES (3, 12, 5, 'CC')

INSERT INTO Orders VALUES (3, 13, 10, 'DD')

INSERT INTO Orders VALUES (4, 14, 4, 'EE')

실행

DECLARE @query NVARCHAR(4000)

DECLARE @pivotColumn NVARCHAR(4000)

DECLARE @selectCols NVARCHAR(4000)

DECLARE @aggCols NVARCHAR(4000)

DECLARE @orderBy NVARCHAR(4000)

SET @query = 'select OriginState,ProductID, Quantity into #temp from dbo.Orders'

SET @pivotColumn = 'OriginState'

SET @selectCols = 'OriginState, ProductID, Quantity'

SET @aggCols = 'sum(Quantity)'

SET @orderBy = ''

 

EXECUTE usp_clrDynamicPivot @query, @pivotColumn, @selectCols, @aggCols,

    @orderBy

GO


결과값

5 데이터 입력 TEST #두번째

INSERT INTO Orders VALUES (2, 1, 1, 'BB')

INSERT INTO Orders VALUES (2, 2, 2, 'BB')

INSERT INTO Orders VALUES (2, 3, 3, 'BB')

INSERT INTO Orders VALUES (2, 4, 4, 'BB')

INSERT INTO Orders VALUES (2, 5, 5, 'BB')

 

INSERT INTO Orders VALUES (3, 1, 1, 'CC')

INSERT INTO Orders VALUES (3, 2, 2, 'CC')

INSERT INTO Orders VALUES (3, 3, 3, 'CC')

INSERT INTO Orders VALUES (3, 4, 4, 'CC')

INSERT INTO Orders VALUES (3, 5, 5, 'CC')

 

 

INSERT INTO Orders VALUES (4, 1, 1, 'DD')

INSERT INTO Orders VALUES (4, 2, 2, 'DD')

INSERT INTO Orders VALUES (4, 3, 3, 'DD')

INSERT INTO Orders VALUES (4, 4, 4, 'DD')

INSERT INTO Orders VALUES (4, 5, 5, 'DD')

실행

DECLARE @query NVARCHAR(4000)

DECLARE @pivotColumn NVARCHAR(4000)

DECLARE @selectCols NVARCHAR(4000)

DECLARE @aggCols NVARCHAR(4000)

DECLARE @orderBy NVARCHAR(4000)

SET @query = 'select OriginState,ProductID, Quantity into #temp from dbo.Orders'

SET @pivotColumn = 'OriginState'

SET @selectCols = 'OriginState, ProductID, Quantity'

SET @aggCols = 'sum(Quantity)'

SET @orderBy = ''

EXECUTE usp_clrDynamicPivot @query, @pivotColumn, @selectCols, @aggCols,

@orderBy

GO


결과값



pivotColumn  컬럼으로 지정 한 'OriginState' 값에 따라 컬럼이 동적으로 피벗 된다.


 

 

Posted by ㏈ª ☞ β┖υΕJini.κR

1. SQL Error Log 발생한 에러

2012-11-27 17:16:55.590 spid3477     Error: 7886, Severity: 20, State: 1.2012-11-27 17:16:55.590 spid3477     A read operation on a large object failed while sending data to the client. A common cause for this is if the application is running in READ UNCOMMITTED isolation level. This connection will be terminated.

 


[그림 1-1]


- 어떤 쿼리(프로시저) 에서 발생하는 에러 인지를 찾기 에러가 주로 발생하는 시간 주기적 (15분 ~ 20분 사이) 발생하여
   발생 후 10분 뒤부터 10분 동안 sp_trace_create 를 사용하여  Trace 수집

-  SQL Error Log 시간대의 TRC 파일 비교 분석 하여 에러 원인 분석



- 원인 및 해결 방법  


[그림 1-2]

이 프로저의 에서 호출하는 1개의 ROW  Image 데이터 형식으로 라는 marshaled_data 필드를 가지고 있다. [그림 1-1] 601 에러가 먼저 발생 Error: 7886, Severity: 20, State: 1 가 발생한것을 알수 있다. [그림 1-2] SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; 으로 인해 테이블 접근시 NOLOCK 로 커밋되지 않는 읽기르 우선 데이터를 읽어서 LOB 영역의 marshaled_data 데이터를 읽으려고 했으나 실제 marshaled_data 필드에 접근해 보니 일부 데이터의 위치가 변경되어 데이터를 찾지 못하게 되어  클라이언트에 데이터를 보내는 동안 큰 개체에서 읽기 작업이 실패 하게 되었고 클라이언트와 연결이 종료 된것으로 에러가 SQL LOG 에 찍히게 된것이다.

해결 방법은 프로시저에 적용 하였던 SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; 를 제거 후 해결 되었다.



Posted by ㏈ª ☞ β┖υΕJini.κR

시스템 기본 정보
OS : Windows 2008 64bit R2 Ent
SQL Server : SQL2008 R2 Ent 10.50.4000.0

Processor : Intel Xeon X5675 3.07Hz (24Core)
Memory : 36G (SQL Max Memory 16G)

서버 용도
전세계 3대륙 8개국가 5개의 DB를 27개의 게시자로 37개의 서버에 총 105개의 구독자를 만들어

분산 전용 서버와 IIS 서버(서비스가 아닌 관리용 리포트 웹)으로 사용


증상

1. SSMS 및 Replication Monitor 에서 스냅샷 생성이 안됨


단 . 수동 실행 하면 생성은 됨
c:\Program Files\Microsoft SQL Server\100\COM 에서 snapshot -publication %publication name% -publisher.....

Replication 정상 동작 확인을 위한 스냅샷 생성시 Output 파일로 Log 도 정상적으로 남지 않음

 


Replication Monitor 를 통해 확인해보면 Agents 에 아래와 같은 오류 발생

Error Message
The replication agent encountered a failure. See the previous job step history message or Replication Monitor for more information. The step failed.

2. 구독자 Error

Error Message
Agent '' is retrying after an error. X retries attempted. See agent job history in the Jobs folder for more details.

해결 방법
기본값으로 설정되어 있는 Desktop Heap에 할당된 메모리가 부족해서 발생한 문제 입니다.

이시스템은 메모리가 충분함에도 불구하고 발생한 이유는 윈도우가 물리적 메모리중 일부를 사용자 인터페이스를 위한 시스템 Desktop Heap 에 할당 되어 있는데 실행중인 Replication Agent 도 많코 시스템의 Replication Monitor 에서 많은 구독자와 연결이 되어 있어 기본값보다 더 많은 Desktop Heap 이 필요 하게 되어 발생 한 것으로 보인다고 하네요^^


Desktop Heap 메모리 관련하게 레지스트리 값 수정을 통해 변경 할 수 있다.
“HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\SubSystems”

“SharedSection=1024,20480,768” 를 “SharedSection=1024,20480,1792” 로 바꾼다. (16의 배수로 바꾸라고 하네요.. 자세한건 저도 잘 몰라요.^^)

하지만 이건 이 시스템에 맞는 설정을 한것이고 윈도우 시스템에서 사용 할 수 있는 양을 고려 하여 기존 값보다 약간의 높은 수치로 변경해 보고 아무 문제가 없으면 조금 더 높은 수치로 변경해 보는 방식으로 변경 해 보는것을 권장 한다.

위 사항은 미국 MS 에서 해결해준 사항을 바탕으로 작성 되었습니다.

라이고님이 정리 해주신 Desktop Heap Monitor Tool 을 통해 모니터링 해보고 적용 하면 좋은듯 싶네요.
http://laigo.kr/276

 

Posted by ㏈ª ☞ β┖υΕJini.κR

게시 DB : SQL 2008 R2 10.05.2817 
구독 DB : SQL 2008 R2 10.05.1600


머지 복제에서 아래와 아래와 같은 오류가 발생 이후  Replication 동작 하지 않음

상태

- 구독자 View Synchronization Status Starting 만 표시후 반응 없음
- Reinitialize 되지 않음
- 아티클을 전부 제거 하였음에도 Replication 삭제 되지 않음
- Replication 삭제시  아래와 같은 에러 발생

TITLE: Microsoft SQL Server Management Studio
------------------------------

Could not delete the subscription at Subscriber 'XXXXX' in database 'XXXXX'.

For help, click: http://go.microsoft.com/fwlink?ProdName=Microsoft%20SQL%20Server&ProdVer=11.0.2100.60&EvtSrc=Microsoft.SqlServer.Management.UI.VSIntegration.ObjectExplorer.
Replication.ReplicationMenuItem&EvtID=CantDeleteSubscriptionAt&LinkId=20476

------------------------------
ADDITIONAL INFORMATION:

An exception occurred while executing a Transact-SQL statement or batch. (Microsoft.SqlServer.ConnectionInfo)

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

User does not have permission to perform this action.
The subscription could not be dropped at this time.
Changed database context to 'ESales'. (Microsoft SQL Server, Error: 15247)

For help, click: http://go.microsoft.com/fwlink?ProdName=Microsoft%20SQL%20Server&ProdVer=10.50.2817&EvtSrc=MSSQLServer&EvtID=15247&LinkId=20476

------------------------------
BUTTONS:

OK
------------------------------


1. Merget Replication

2. 구독자 삭제 시도


3. 아래와 같은 에러로 삭제 불가

삭제 방법

게시자 서버에서 실행

use [게시DB명]
exec sys.sp_dropmergesubscription
@publication = N'머지복제이름', 
@subscriber = N'구독자서버' ,
@ignore_distributor=1


exec 구독서버명.구독 DB명.sys.sp_mergesubscription_cleanup
@publisher = N'게시자서버', 
@publisher_db = N'게시DB' ,
@publication = N'머지복제이름'


exec sp_dropmergepublication @publication = N'머지복제이름'

 

 



 

Posted by ㏈ª ☞ β┖υΕJini.κR

Error 8646: The index entry for row ID was not fount in index ID 2, of table 848058107, in database 'BLUEJINI_SVR'

SQL 2000 Merge Replication  삭제시 위와 같으 오류가 발생 할 경우

DBCC CHECKDB('DB명')

관련 테이블의 데이터 TRUNCATE

TRUNCATE TABLE MSmerge_contents
TRUNCATE TABLE MSmerge_genhistory

후 복제 제거를 통하여 해결 할 수 있다.



Posted by ㏈ª ☞ β┖υΕJini.κR

 



Error messages:
SELECT INTO failed because the following SET options have incorrect settings: 'ANSI_PADDING'. Verify that SET options are correct for use with indexed views and/or indexes on computed columns and/or query notifications and/or xml data type methods. (Source: MSSQLServer, Error number: 1934)
Get help: http://help/1934
SELECT INTO failed because the following SET options have incorrect settings: 'ANSI_PADDING'. Verify that SET options are correct for use with indexed views and/or indexes on computed columns and/or query notifications and/or xml data type methods. (Source: MSSQLServer, Error number: 1934)
Get help: http://help/1934


게시자 서버의 UNC 폴더에서 복제 관련 *.sch 들어 가서 SET ANSI_PADDING OFF 에서 ON 으로 변경 하면 됩니다.

Posted by ㏈ª ☞ β┖υΕJini.κR

sp_helpdb 실행


name 명은 실제 서비스 DB 이름이라 삭제 하였고 owner 즉 소유자가 ~~UNKNOWN~~  인걸 알수 있다.

이렇게 되어 있는 DB 를 마우스 오른쪽를 이용하여 속성을 보고자 할때 아래와 같은 Error 가 나면서 볼수 없다.



DB 속성 보기 Error

Property Owner is not available for Database '[DB명]'. This property may not exist for this object, or may not be retrievable due to insufficient access rights.  (Microsoft.SqlServer.Smo)

소유자 지정으로 해결
USE DB명
exec sp_changedbowner @loginame = 'sa'

 

Posted by ㏈ª ☞ β┖υΕJini.κR


얼마전 서버 이전 후 복제 관련한 오류가 발생하였다. 복제 구성시 물리적 File 소유자를 지정 되어 있지 않아 발생한 것이다.

USE <Publication database name>
GO
EXEC sp_droppublication @publication = N'<Publication name>'
USE master
GO
EXEC sp_replicationdboption @dbname = N'<Publication database name>', @optname = N'publish', @value = N'false'

트랜잭션 게시자 삭제시 아래와 같은 오류가 나는 경우가 있을 것이다.

“TITLE: Microsoft.SqlServer.ConnectionInfo

SQL Server could not disable publishing and distribution on <computer-name>\<sqlServerName>.

ADDITIONAL INFORMATION:

An exception occurred while executing a Transact-SQL statement or batch. (Microsoft.SqlServer.ConnectionInfo)

Cannot execute as the database principal because the principal "dbo" does not exist, this type of principal cannot be impersonated, or you do not have permission.

Changed database context to 'master'. (Microsoft SQL Server, Error: 15517)”

이런 경우 복제에 사용되는 데이터베이스 소유자를 확인해봐야 한다.

 

서버 이전시 원래의 소유자에 대한 계정이 없어 발생한 것이었다.  Owner 에 소유자를 지정한 후 삭제 하면 정상 삭제 되는것을 볼 수 있다.

소유자 지정

exec sp_changedbowner @loginame = 'sa'
Posted by ㏈ª ☞ β┖υΕJini.κR


64bit Sql Server 서버에서 32Bit 서버 연결 할때 아래와 같은 에러가 발생 합니다.

OLE DB provider "SQLNCLI10" for linked server "XXXXXX" returned message "The stored procedure required to complete this operation could not be found on the server. Please contact your system administrator




해결 방법 

USE MASTER;

CREATE PROCEDURE SP_TABLES_INFO_ROWSET_64

       @TABLE_NAME SYSNAME,

       @TABLE_SCHEMA     SYSNAME = NULL,

       @TABLE_TYPE NVARCHAR(255) = NULL

AS

DECLARE @RESULT INT SET @RESULT = 0

EXEC @RESULT = SP_TABLES_INFO_ROWSET @TABLE_NAME, @TABLE_SCHEMA, @TABLE_TYPE



MS 관련 링크
http://support.microsoft.com/?id=906954
Posted by ㏈ª ☞ β┖υΕJini.κR