[운영] 서버 데이터베이스 SQL 문장 정리(3)

6053 단어 서버 운영
1. 성 획 순서:
Select * From TableName Order By CustomerName Collate Chinese_PRC_Stroke_ci_as // 

2. 데이터베이스 암호화:
select encrypt(' ')

 
select pwdencrypt(' ')
select pwdcompare(' ',' ') = 1-- ;  encrypt(' ')
select pwdencrypt(' ')
select pwdcompare(' ',' ') = 1-- ; 

3. 테이블의 필드를 다시 가져옵니다.
declare @list varchar(1000),
@sql nvarchar(1000)
select @list=@list+','+b.name from sysobjects a,syscolumns b where a.id=b.id and a.name=' A'
set @sql='select '+right(@list,len(@list)-1)+' from  A'
exec (@sql)

4. 하드 드라이브 파티션 보기:
EXEC master..xp_fixeddrives

5. A, B 테이블이 동일한지 비교합니다.
if (select checksum_agg(binary_checksum(*)) from A)
     =
    (select checksum_agg(binary_checksum(*)) from B)
print ' '
else
print ' '

6. 모든 이벤트 탐색기 프로세스를 죽이기:
DECLARE hcforeach CURSOR GLOBAL FOR SELECT 'kill '+RTRIM(spid) FROM master.dbo.sysprocesses
WHERE program_name IN('SQL profiler',N'SQL  ')
EXEC sp_msforeach_worker '?'

7. 로깅 검색: N조 로깅으로 시작
Select Top N * From  

-----------------------N에서 M줄로 기록(주 색인 ID가 있어야 함)
Select Top M-N * From   Where ID in (Select Top M ID From  ) Order by ID   Desc

---------------------------N에서 끝까지 기록
Select Top N * From   Order by ID Desc

예를 들어 1: 한 장의 테이블에 1만여 개의 기록이 있는데 표의 첫 번째 필드인 Recid는 자체 성장 필드이고 SQL 문장을 써서 표의 31번째에서 40번째 기록을 찾아낸다.
 select top 10 recid from A where recid not  in(select top 30 recid from A)

분석: 이렇게 쓰면 문제가 생길 수 있습니다. 만약recid가 테이블에 논리적 인덱스가 존재한다면.
select top 10 recid from A where...는 인덱스에서 찾고, 뒤에 있는 select top 30 recid from A는 데이터 테이블에서 찾습니다. 이렇게 하면 인덱스의 순서가 데이터 테이블의 순서와 일치하지 않을 수 있기 때문에 원래 얻고 싶은 데이터가 아닙니다.
솔루션
  • order by select top 30 recid from A order by ricid 이 필드가 스스로 증가하지 않으면 문제가 발생합니다
  • 그 하위 조회에서도 조건을 추가합니다: select top 30 recid from A where recid>-1

  • 예2: 조회표의 마지막 항목으로 기록하고 이 표가 얼마나 많은 데이터와 표 구조를 가지고 있는지 모른다. 
    set @s = 'select top 1 * from T   where pid not in (select top ' + str(@count-1) + ' pid  from  T)'
    print @s      exec  sp_executesql  @s

    9: 현재 데이터베이스에 있는 모든 사용자 테이블 가져오기
    select Name from sysobjects where xtype='u' and status>=0

    10: 테이블의 모든 필드 가져오기
    select name from syscolumns where id=object_id(' ')
    select name from syscolumns where id in (select id from sysobjects where type = 'u' and name = ' ')

    두 가지 방식의 효과는 같다
    11: 테이블과 관련된 보기, 저장 프로세스, 함수 보기
    select a.* from sysobjects a, syscomments b where a.id = b.id and b.text like '% %'

    12: 현재 데이터베이스의 모든 저장 프로세스 보기
    select name as   from sysobjects where xtype='P'

    13: 사용자가 만든 모든 데이터베이스 조회
    select * from master..sysdatabases D where sid not in(select sid from master..syslogins where name='sa')

    혹은
    select dbid, name AS DB_NAME from master..sysdatabases where sid <> 0x01

    14: 테이블의 필드와 데이터 형식을 조회합니다
    select column_name,data_type from information_schema.columns where table_name = ' '

    15: 서로 다른 서버 데이터베이스 간의 데이터 작업
    -- 링크 서버 만들기
    exec sp_addlinkedserver   'ITSV ', ' ', 'SQLOLEDB ', ' ip  ' 
    exec sp_addlinkedsrvlogin  'ITSV ', 'false ',null, '  ', '  ' 

    -- 질의 예
    select * from ITSV. .dbo.  

    -- 예제 가져오기
    select * into   from ITSV. .dbo.  

    - 나중에 사용하지 않을 때 링크 서버 제거
    exec sp_dropserver  'ITSV ', 'droplogins ' 

     
    - 원격/랜 데이터 연결(openrowset/openquery/opendatasource)
    --1、openrowset
    -- 질의 예
    select * from openrowset( 'SQLOLEDB ', 'sql  '; '  '; '  ', .dbo. ) 

    -- 로컬 테이블 생성
    select * into   from openrowset( 'SQLOLEDB ', 'sql  '; '  '; '  ', .dbo. ) 

     
    - 로컬 테이블을 원격 테이블로 가져오기
    insert openrowset( 'SQLOLEDB ', 'sql  '; '  '; '  ', .dbo. ) 
    select *from   

    -- 로컬 테이블 업데이트
    update b 
    set b. A=a. A 

     
    from openrowset( 'SQLOLEDB ', 'sql  '; '  '; '  ', .dbo. )as a inner join   b 
    on a.column1=b.column1 

    --openquery 사용법은 연결을 만들어야 합니다
    - 먼저 연결 생성 링크 서버 만들기
    exec sp_addlinkedserver   'ITSV ', ' ', 'SQLOLEDB ', ' ip  ' 

    -- 질의
    select * FROM openquery(ITSV,  'SELECT *  FROM  .dbo.  ') 

    - 로컬 테이블을 원격 테이블로 가져오기
    insert openquery(ITSV,  'SELECT *  FROM  .dbo.  ') 
    select * from   

    -- 로컬 테이블 업데이트
    update b 
    set b. B=a. B 
    FROM openquery(ITSV,  'SELECT * FROM  .dbo.  ') as a  inner join   b on a. A=b. A 

     
    --3、opendatasource/openrowset
    SELECT   * FROM   opendatasource( 'SQLOLEDB ',  'Data Source=ip/ServerName;User ID= ;Password=  ' ).test.dbo.roy_ta 

    - 로컬 테이블을 원격 테이블로 가져오기 i
    nsert opendatasource( 'SQLOLEDB ',  'Data Source=ip/ServerName;User ID= ;Password=  '). .dbo. 
    
    select * from    

    좋은 웹페이지 즐겨찾기