SQL Server의 숨겨진 기능


215

SQL Server 의 숨겨진 기능은 무엇입니까 ?

예를 들어, 문서화되지 않은 시스템 저장 프로 시저, 매우 유용하지만 충분히 문서화되지 않은 작업을 수행하는 트릭?


답변

모든 위대한 답변에 대해 모두에게 감사합니다!

저장 프로 시저

  • sp_msforeachtable : '?'명령을 실행합니다 각 테이블 이름으로 대체 됨 (v6.5 이상)
  • sp_msforeachdb : '?'명령을 실행합니다 각 데이터베이스 이름으로 대체 (v7 이상)
  • sp_who2 : sp_who와 비슷하지만 블록 문제 해결에 대한 더 많은 정보 (v7 이상)
  • sp_helptext : 저장 프로 시저의 코드를 원하면보기 및 UDF
  • sp_tables : 범위 내에서 데이터베이스의 모든 테이블 및 뷰 목록을 반환합니다.
  • sp_stored_procedures : 모든 저장 프로 시저 목록을 반환
  • xp_sscanf : 문자열에서 각 형식 인수로 지정된 인수 위치로 데이터를 읽습니다.
  • xp_fixeddrives : : 가장 큰 여유 공간이있는 고정 드라이브 찾기
  • sp_help : 테이블 구조, 테이블의 인덱스 및 제약 조건을 알고 싶다면 또한 뷰와 UDF. 바로 가기는 Alt + F1입니다.

짧은 발췌

  • 무작위 순서로 행 반환
  • 마지막으로 수정 한 날짜 별 모든 데이터베이스 사용자 개체
  • 반환 날짜 만
  • 현재 주 어딘가에 날짜가 기록 된 레코드를 찾으십시오.
  • 지난 주에 발생한 날짜를 기록하십시오.
  • 현재 주가 시작되는 날짜를 반환합니다.
  • 지난 주 시작 날짜를 반환합니다.
  • 서버에 배포 된 절차의 텍스트를 참조하십시오.
  • 데이터베이스에 대한 모든 연결을 삭제하십시오.
  • 테이블 체크섬
  • 행 체크섬
  • 데이터베이스에서 모든 절차를 삭제
  • 복원 후 로그인 ID를 올바르게 다시 매핑
  • INSERT 문에서 스토어드 프로 시저 호출
  • 키워드로 절차 찾기
  • 데이터베이스에서 모든 절차를 삭제
  • 프로그래밍 방식으로 데이터베이스에 대한 트랜잭션 로그를 쿼리하십시오.

기능

  • 해시 바이트 ()
  • EncryptByKey
  • PIVOT 명령

기타

  • 연결 문자열 엑스트라
  • TableDiff.exe
  • 로그온 이벤트에 대한 트리거 (서비스 팩 2의 새로운 기능)
  • PCC (지속 계산 열)로 성능 향상
  • sys.database_principles의 DEFAULT_SCHEMA 설정
  • 강제 매개 변수화
  • Vardecimal 저장소 형식
  • 몇 초 만에 가장 인기있는 검색어 파악
  • 확장 가능한 공유 데이터베이스
  • SQL Management Studio의 테이블 / 저장 프로 시저 필터 기능
  • 추적 플래그
  • GO배치를 반복 한 후의 번호
  • 스키마를 사용한 보안
  • 내장 된 암호화 기능, 뷰 및 트리거가있는 기본 테이블을 사용하여 암호화

4
알려진 경우 각 답변에 해당 버전을 포함시키는 것이 좋습니다. (2000 년 이상, 2005 년, 2000 년 등)
bw

이 질문에는 많은 장점이 있습니다. 삭제하지 마십시오! :-)
Sklivvz

답변:


91

Management Studio에서 GO 배치 종료 마커 뒤에 숫자를 넣어 배치가 해당 횟수만큼 반복되도록 할 수 있습니다.

PRINT 'X'
GO 10

'X'를 10 번 인쇄합니다. 이렇게하면 반복적 인 작업을 수행 할 때 번거로운 복사 / 붙여 넣기에서 벗어날 수 있습니다.


70

많은 SQL Server 개발자는 여전히 DELETE, INSERT 및 UPDATE 문 에서 OUTPUT 절 (SQL Server 2005 이상)에 대해 알지 못하는 것 같습니다 .

행이 삽입, 갱신 또는 삭제 한 알 매우 유용 할 수 있고, OUTPUT 절은 아주 쉽게 할 수 있습니다 - 그것은라는 "가상"테이블에 액세스 할 수 있도록 inserted하고 deleted(트리거에서 등) :

DELETE FROM (table)
OUTPUT deleted.ID, deleted.Description
WHERE (condition)

OUTPUT 절을 사용하여 INT IDENTITY 기본 키 필드가있는 테이블에 값을 삽입하는 경우 삽입 된 새 ID를 즉시 얻을 수 있습니다.

INSERT INTO MyTable(Field1, Field2)
OUTPUT inserted.ID
VALUES (Value1, Value2)

그리고 업데이트하는 경우 변경된 내용을 아는 것이 매우 유용 할 수 있습니다.이 경우 insertedUPDATE 이후의 새 값을 deleted나타내며 UPDATE 전의 이전 값 을 나타냅니다.

UPDATE (table)
SET field1 = value1, field2 = value2
OUTPUT inserted.ID, deleted.field1, inserted.field1
WHERE (condition)

많은 정보가 리턴되면 OUTPUT의 출력을 임시 테이블 또는 테이블 변수 ( OUTPUT INTO @myInfoTable) 로 경로 재 지정할 수도 있습니다 .

매우 유용하며 알려진 바가 거의 없습니다!

마크


52

sp_msforeachtable: '?'명령을 실행합니다 각 테이블 이름으로 대체되었습니다. 예 :

exec sp_msforeachtable "dbcc dbreindex('?')"

각 테이블에 대해 최대 3 개의 명령을 실행할 수 있습니다

exec sp_msforeachtable
    @Command1 = 'print ''reindexing table ?''',
    @Command2 = 'dbcc dbreindex(''?'')',
    @Command3 = 'select count (*) [?] from ?'

또한, sp_MSforeachdb


2
물음표 주위에 작은 따옴표를 사용하여 쿼리에서 테이블 이름을 얻을 수 있습니다. sp_msforeachtable "선택 카운트 (*), '?' "에서 tabenm으로
Jody

51

연결 문자열 엑스트라 :

MultipleActiveResultSets = true;

따라서 ADO.Net 2.0 이상은 단일 데이터베이스 연결에서 여러 개의 정방향 전용 읽기 전용 결과 집합을 읽으므로 많은 양의 읽기를 수행하는 경우 성능을 향상시킬 수 있습니다. 여러 가지 쿼리 유형을 수행하더라도이를 설정할 수 있습니다.

응용 프로그램 이름 = MyProgramName

이제 sysprocesses 테이블을 쿼리하여 활성 연결 목록을 보려면 프로그램 이름이 ".Net SqlClient Data Provider"대신 program_name 열에 나타납니다.


7
회사에서 응용 프로그램 이름을 요구 사항으로 설정했습니다. 모든 새로운 앱은 고유 한 이름을 가져야합니다. 어떤 앱을 잠 그거나 부러 뜨린 앱을 훨씬 쉽게 추적 할 수 있습니다.
Neil N

2
응용 프로그램 이름은 프로파일 러에서 필터로도 사용할 수 있습니다. 동료의 쿼리가 아닌 쿼리 만 보려면 많은 도움이됩니다.
Mathias F

33

TableDiff.exe

  • 테이블 차이 도구를 사용하면 소스 테이블과 대상 테이블 또는 뷰 간의 차이를 발견하고 조정할 수 있습니다. Tablediff Utility는 스키마와 데이터의 차이점을보고 할 수 있습니다. tablediff의 가장 인기있는 기능은 테이블 간의 차이를 조정하는 대상에서 실행할 수있는 스크립트를 생성 할 수 있다는 것입니다.

링크


31

무작위 순서로 행을 리턴하는 덜 알려진 TSQL 기술 :

-- Return rows in a random order
SELECT 
    SomeColumn 
FROM 
    SomeTable
ORDER BY 
    CHECKSUM(NEWID())

6
작은 결과 집합에 적합합니다. 여유 시간이 없다면 10000 개 이상의 행이있는 테이블에는 사용하지 않을 것입니다.
John Sheehan

나는 그것보다 훨씬 큰 테이블에서 그것을 사용했으며 너무 느리지 않았습니다.
Mitch Wheat

CHECKSUM ()의 목적은 무엇입니까? NEWID ()만으로 주문할 수 있습니다.
Jonas Lincoln

6
나는 심지어 CHECKSUM ()없이 100,000,000 (100 mil) 행에서 괜찮은 결과를 보았습니다. 또한 ORDER BY NEWID가 아닌 이유도 물어봐야합니다.
Troy DeMonbreun

5
@GateKiller : Checksum ()이 실수가 아니기 때문에 편집 내용을 롤백했습니다. 정렬 열의 크기가 줄어 듭니다.
Mitch Wheat

30

Management Studio에서 다음을 통해 쉼표로 구분 된 테이블 열 목록을 빠르게 얻을 수 있습니다.

  1. 개체 탐색기에서 지정된 테이블 아래의 노드를 확장합니다 (따라서 열, 키, 제약 조건, 트리거 등의 폴더가 표시됨)
  2. 열 폴더를 가리키고 쿼리로 드래그하십시오.

이것은 테이블을 마우스 오른쪽 버튼으로 클릭하고 다른 이름으로 스크립트 테이블 ...을 선택한 다음 삽입을 선택하여 반환 된 heinous 형식을 사용하지 않으려는 경우에 유용합니다.이 트릭은 다른 폴더와 함께 작동하여 폴더 내에 포함 된 쉼표로 구분 된 이름 목록.


23

행 생성자

하나의 insert 문으로 여러 행의 데이터를 삽입 할 수 있습니다.

INSERT INTO Colors (id, Color)
VALUES (1, 'Red'),
       (2, 'Blue'),
       (3, 'Green'),
       (4, 'Yellow')

나는 이것을 투표했지만 MSSQL 2005에서 시도했지만 작동하지 않습니다. 2008 만?
richardtallent 2009

11
네, 2008 년의 새로운 기능입니다.
Rob Boek

2
이것은 DB2에서 SQL Server로 왔을 때 놓쳤던 기능이었습니다. DB2에서는 개별 삽입 문 대신 이것을 사용할 때 속도가 크게 향상되었습니다.
Nathan Koop



20

가장 인기있는 검색어 파악

  • sys.dm_exec_query_stats를 사용하면 단일 쿼리로 여러 가지 쿼리 분석 조합을 파악할 수 있습니다.

commnad와 연결

select * from sys.dm_exec_query_stats 
order by execution_count desc


16

예외와 교차

이 두 키워드는 정교한 조인 및 하위 쿼리를 작성하는 대신 두 쿼리 결과를 비교할 때 쿼리의 의도를 표현하는 훨씬 간결하고 읽기 쉬운 방법입니다. SQL Server 2005의 새로운 기능으로, 수년 동안 TSQL 언어에 이미 존재했던 UNION을 강력하게 보완합니다.

EXCEPT, INTERSECT 및 UNION의 개념은 모든 최신 RDBMS에서 사용하는 관계형 모델링의 기초 및 기초로 사용되는 세트 이론에서 기본입니다. 이제 벤 다이어그램 유형 결과는 TSQL을 사용하여보다 직관적이고 쉽게 생성 할 수 있습니다.


16

정확히 숨겨져 있지는 않지만 PIVOT 명령 에 대해 너무 많은 사람들이 아는 것은 없습니다 . 커서를 사용하는 저장 프로 시저를 변경할 수 있었고 줄 수의 10 분의 1의 빠른 6 초 코드를 실행하는 데 2 ​​분이 걸렸습니다!


16

테스트 목적 또는 기타 목적으로 데이터베이스를 복원 할 때 유용합니다. 로그인 ID를 올바르게 다시 매핑합니다.

EXEC sp_change_users_login 'Auto_Fix', 'Mary', NULL, 'B3r12-36'

나는이 절차가 전에 작동하지 않았으며 개체 소유권을 임시 사용자로 변경하고 원래 사용자를 삭제하고 원본을 다시 추가하고 소유권을 다시 할당해야했습니다.
Ugh

15

데이터베이스에 대한 모든 연결을 삭제하십시오.

Use Master
Go

Declare @dbname sysname

Set @dbname = 'name of database you want to drop connections from'

Declare @spid int
Select @spid = min(spid) from master.dbo.sysprocesses
where dbid = db_id(@dbname)
While @spid Is Not Null
Begin
        Execute ('Kill ' + @spid)
        Select @spid = min(spid) from master.dbo.sysprocesses
        where dbid = db_id(@dbname) and spid > @spid
End

나를 위해 이것을 수행하는 하나의 라이너 또는 드롭 데이터베이스 매개 변수가 있습니까? UI를 통해 '데이터베이스 삭제'를 시도하면 '기존 연결 닫기'확인란이 있으며 이는 부울 매개 변수임을 나타냅니다.
DevinB

1
실제로, 나는 두 줄 해결책을 찾았습니다. ALTER의 DATABASE [@ DATABASE_NAME @] SET READ_ONLY WITH ROLLBACK IMMEDIATE --This 연결을 끊 모든 사용자에 대한 ALTER DATABASE [@ DATABASE_NAME @] SET READ_WRITE WITH ROLLBACK IMMEDIATE DROP의 DATABASE [@ DATABASE_NAME @]
DevinB

1
ALTER DATABASE MyDB SET SINGLE_USER WITH ROLLBACK IMMEDIATE새로운 연결도 발생하지 않습니다.
ErikE

15

테이블 체크섬

Select CheckSum_Agg(Binary_CheckSum(*)) From Table With (NOLOCK)

행 체크섬

Select CheckSum_Agg(Binary_CheckSum(*)) From Table With (NOLOCK) Where Column = Value

2
이를 통해 테이블의 모든 데이터에 대한 체크섬을 생성 할 수 있습니다. 두 개의 행 또는 두 개의 테이블이 동일한 지 확인하는 간단하고 빠른 방법입니다.
GateKiller

15

이것이 숨겨진 기능인지 확실하지 않지만이 문제를 발견하고 많은 경우에 유용하다는 것을 알았습니다. 커서를 사용하고 select 문을 반복하지 않고 단일 select 문에서 필드 집합을 연결할 수 있습니다.

예:

DECLARE @nvcConcatonated nvarchar(max)
SET @nvcConcatonated = ''

SELECT @nvcConcatonated = @nvcConcatonated + C.CompanyName + ', '
FROM tblCompany C
WHERE C.CompanyID IN (1,2,3)

SELECT @nvcConcatonated

결과 :

Acme, Microsoft, Apple,

2
변수를 초기화 할 필요없이 COALESCE ()를 사용하여 동일한 작업을 수행 할 수도 있습니다. SELECT COALESCE @nvcConcatonated = ( ',', '+ @nvcConcatonated') + CAST (C.CompanyName 같은 VARCHAR (255)) ... FROM
크리스토퍼 클라인

이것은 또한 update 문에서도 작동합니다. 때로는 업데이트 된 ID 목록을 연결하는 것과 같은 작업을 수행하는 데 유용합니다.
EBarr

14

저장 프로 시저 코드를 원하는 경우 다음을 수행 할 수 있습니다.

sp_helptext 'ProcedureName'

(숨겨진 기능인지 확실하지 않지만 항상 사용합니다)


이유를 모르지만 sp_helptext 출력은 원본의 너무 긴 줄에서 약간 구 of습니다. Sprocs를 스크립팅 할 때 이런 일이 발생하지 않으므로 더 강력한 또 다른 내보내기 메커니즘이 있습니까? sp_helptext 'MyView'도 유용합니다.
Kristen

무슨 말인지 잘 모르겠습니다. 나를 위해 SP 코드는 원래 파일 (모든 CR 등)로 스크립팅 한 것과 같은 형식으로 출력됩니다.
Eduardo Molteni

정확한 세부 사항 은 기억 나지 않지만 텍스트가 저장되는 방식, 즉 페이지 크기와 관련이 있습니다. 출력은 대부분 정확하지만 매번 추가 줄 바꿈이 발생합니다.
RolandTumble

13

저장 프로 시저 트릭은 INSERT 문에서 호출 할 수 있다는 것입니다. SQL Server 데이터베이스에서 작업 할 때 매우 유용했습니다.

CREATE TABLE #toto (v1 int, v2 int, v3 char(4), status char(6))
INSERT #toto (v1, v2, v3, status) EXEC dbo.sp_fulubulu(sp_param1)
SELECT * FROM #toto
DROP TABLE #toto

1
슬프게도 @TableVariable과 함께 사용할 수 없습니다
Kristen

이 매우 유용한 기술의 문제점은 대부분의 #tables와 달리 모든 열을 완전히 정의해야한다는 것입니다. 이 작업을 수행하는 게으른 방법은 마지막에 호출하는 proc 내에 #table을 만든 다음 tempdb에서 sp_help를 복사하여 붙여 넣은 다음 proc에서 코드를 제거하는 것입니다. 완료
아돌프 마늘

12

SQL Server 2005/2008에서 SELECT 쿼리 결과에 행 번호를 표시하려면

SELECT ( ROW_NUMBER() OVER (ORDER BY OrderId) ) AS RowNumber,
        GrandTotal, CustomerId, PurchaseDate
FROM Orders

ORDER BY는 필수 조항입니다. OVER () 절은 SQL 엔진에 지정된 열 (이 경우 OrderId)의 데이터를 정렬하고 정렬 결과에 따라 숫자를 지정하도록 지시합니다.


그들은 "RowNumberInTable"로 구문 단어를 구문 분석 SQL 엔진에서 구문의 suger를 사용한 경우 간단하지 않을 것이다
없음

1
창 기능의 경우 +1 당신은 OVER (PARTITION의 BY를 ...)를 사용하여 레코드의 하위 집합 OVER 일을 할 수 msdn.microsoft.com/en-us/library/ms189461%28v=SQL.100%29.aspx
매트 스티븐슨

10

저장 프로 시저 인수를 구문 분석하는 데 유용합니다. xp_sscanf

문자열에서 각 형식 인수로 지정된 인수 위치로 데이터를 읽습니다.

다음 예제는 xp_sscanf를 사용하여 소스 문자열 형식에서의 위치를 ​​기반으로 소스 문자열에서 두 개의 값을 추출합니다.

DECLARE @filename varchar (20), @message varchar (20)
EXEC xp_sscanf 'sync -b -fproducts10.tmp -rrandom', 'sync -b -f%s -r%s', 
  @filename OUTPUT, @message OUTPUT
SELECT @filename, @message

결과 집합은 다음과 같습니다.

-------------------- -------------------- 
products10.tmp        random

4
나는 바보 같은 순간을 가져야한다. 우리가 이것을 어디에서 사용할 수 있는지 말해 줄 수 있습니까?
Raj More 더

9

반환 날짜 만

Select Cast(Floor(Cast(Getdate() As Float))As Datetime)

또는

Select DateAdd(Day, 0, DateDiff(Day, 0, Getdate()))

짧은 버전-SELECT CAST (FLOOR (CAST (@DateTime AS FLOAT)) AS DATETIME)
Meff

당근 빠따 지. CASTFLOORCAST 규칙.
StingyJack

그것에 대한 참조를 찾을 수는 없지만 SELECT DateAdd (Day, 0, DateDiff (Day, 0, @DateTime))가 더 빠르다는 테스트를 기억합니다. 어느 쪽이든 깨달은 것이 행복합니다!
Kristen

sqlteam.com/forums/topic.asp?TOPIC_ID=35296#107617을 찾았 지만 CAST / FLOOR 메소드는 포함되지 않았습니다. 중간 규모의 레코드 세트에 대한 비공식 테스트에 따르면 DATEADD는 CAST / FLOOR보다 약 7 % 더 빠를 수 있습니다. 대부분의 상황에 대해 걱정할 필요가 없습니다
Kristen

그러나 다른 방법을 추가했습니다. 나의 빠른 테스트는 캐스트 플로어 방법이 800 나노초 더 빠르다는 것을 보여줍니다. 그래서 실제로는 아무것도 없습니다.
GateKiller

9

dm_db_index_usage_stats

이를 통해 테이블에 DateUpdated 열이 없더라도 테이블의 데이터가 최근에 업데이트되었는지 알 수 있습니다.

SELECT OBJECT_NAME(OBJECT_ID) AS DatabaseName, last_user_update,*
FROM sys.dm_db_index_usage_stats
WHERE database_id = DB_ID( 'MyDatabase')
AND OBJECT_ID=OBJECT_ID('MyTable')

코드 : http://blog.sqlauthority.com/2009/05/09/sql-server-find-last-date-time-updated-for-any-table/

에서 참조 정보 : SQL 서버 - 테이블의 마지막에 삽입 된 행의 날짜 / 시간 무엇입니까?

SQL 2005 이상에서 사용 가능


7

다음은 유용한 기능이지만 많은 사람들이 모르는 것 같습니다.

sp_tables

현재 환경에서 쿼리 할 수있는 개체 목록을 반환합니다. 이는 동의어 개체를 제외하고 FROM 절에 나타날 수있는 모든 개체를 의미합니다.

링크

sp_stored_procedures

현재 환경에서 저장 프로 시저 목록을 반환합니다.

링크


7

현재 주 어딘가에 날짜가 기록 된 레코드를 찾으십시오.

where dateadd( week, datediff( week, 0, TransDate ), 0 ) =
dateadd( week, datediff( week, 0, getdate() ), 0 )

지난 주에 발생한 날짜를 기록하십시오.

where dateadd( week, datediff( week, 0, TransDate ), 0 ) =
dateadd( week, datediff( week, 0, getdate() ) - 1, 0 )

현재 주가 시작되는 날짜를 반환합니다.

select dateadd( week, datediff( week, 0, getdate() ), 0 )

지난 주 시작 날짜를 반환합니다.

select dateadd( week, datediff( week, 0, getdate() ) - 1, 0 )

양호하지만 TransDate의 색인은 사용되지 않습니다. 나는 오히려 쓸 것이다
vaso

TransDate> = convert (datetime, floor (convert (float, dateadd (day, -datepart (weekday, @date) +1, @date)))) 및 TransDate> = convert (datetime, floor (convert (float, dateadd) (일, 7-datepart (weekday, @date) +1, @date)))
vaso

수정 : 여기서 TransDate> = convert (datetime, floor (convert (float, dateadd (day, -datepart (weekday, @date) +1, @date)))) 및 TransDate <convert (datetime, floor (convert (float, dateadd (day, 7-datepart (weekday, @date) +1, @date))))
vaso

7

숨겨진 기능은 아니지만 Management \ Tools \ Options \ Keyboard 아래의 키 매핑 설정 : Alt + F1은 기본적으로 sp_help "선택한 텍스트"로 설정되어 있지만 sp_helptext "선택한 텍스트"에 Ctrl + F1을 추가하지 않으면 살 수 없습니다.


나는 dB의의를 따라 이동, 또한 USE 명령을 구성하는 데 사용할
조니 D. 카노 -Leftware-을

7

지속 계산 열

  • 계산 열은 런타임 계산 비용을 데이터 수정 단계로 전환하는 데 도움이됩니다. 계산 열은 나머지 행과 함께 저장되며 계산 열과 쿼리의식이 일치 할 때 투명하게 활용됩니다. 또한 PCC에서 인덱스를 작성하여 식의 필터링 및 범위 스캔 속도를 높일 수 있습니다.

링크


7

정렬하기에 적합한 열이 없거나 테이블에서 기본 정렬 순서를 원하고 각 행을 열거하려는 경우가 있습니다. 그렇게하려면 "order by"절에 "(select 1)"을 입력하면 원하는 것을 얻을 수 있습니다. 깔끔하지?

select row_number() over (order by (select 1)), * from dbo.Table as t

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.