OPENQUERY

IT/MS-SQL 2011. 5. 18. 16:19

예제)

SET @sql = N'SELECT * FROM OPENQUERY(['+@InstanceName+'],
''SELECT DISTINCT  D.referenced_major_id,D.object_id
 FROM ['+@DatabaseName+'].sys.objects AS O
 JOIN ['+@DatabaseName+'].sys.sql_dependencies AS D ON O.object_id=D.referenced_major_id
 WHERE O.[TYPE] in (''''IF'''',''''P'''',''''FN'''',''''TF'''')'



지정한 연결된 서버에서 지정한 통과 쿼리를 실행합니다. 이 서버는 OLE DB 데이터 원본입니다. OPENQUERY는 테이블 이름처럼 쿼리의 FROM 절에서 참조될 수 있습니다. 또한 OPENQUERY는 INSERT, UPDATE 또는 DELETE 문의 대상 테이블로 참조될 수도 있습니다. 이것은 OLE DB 공급자 기능에 종속됩니다. 쿼리는 여러 결과 집합을 반환할 수 있지만 OPENQUERY는 첫 번째 것만 반환합니다.

구문

OPENQUERY ( linked_server ,'query' )

인수

linked_server

연결된 서버의 이름을 나타내는 식별자입니다.

' query '

연결된 서버에서 실행된 쿼리 문자열입니다. 문자열의 최대 길이는 8KB입니다.

주의

OPENQUERY는 변수를 인수로 받아들이지 않습니다.

SQL Server 2000 이상 버전에서는 연결된 서버에서 확장 저장 프로시저를 실행하는 데 OPENQUERY를 사용할 수 없습니다. 그러나 확장 저장 프로시저는 네 부분으로 된 이름을 사용하여 연결된 서버에서 실행할 수 있습니다. 예를 들면 다음과 같습니다.

EXEC SeattleSales.master.dbo.xp_msver

사용 권한

모든 사용자가 OPENQUERY를 실행할 수 있습니다. 원격 서버 연결에 사용되는 사용 권한은 연결된 서버에 대해 정의된 설정에서 가져옵니다.

예)

1. SELECT 통과 쿼리 실행

다음 예에서는 Microsoft OLE DB Provider for Oracle을 사용하여 Oracle 데이터베이스에 대해 OracleSvr이라는 연결된 서버를 만듭니다. 그런 다음 이 연결된 서버에 대해 SELECT 통과 쿼리를 사용합니다.

참고:
이 예에서는 ORCLDB라는 Oracle 데이터베이스 별칭이 생성되어 있다고 가정합니다.

EXEC sp_addlinkedserver 'OracleSvr', 
   'Oracle 7.3', 
   'MSDAORA', 
   'ORCLDB'
GO
SELECT *
FROM OPENQUERY(OracleSvr, 'SELECT name, id FROM joe.titles') 
GO

2. UPDATE 통과 쿼리 실행

다음 예에서는 예 1에서 만든 연결된 서버에 대해 UPDATE 통과 쿼리를 사용합니다.

UPDATE OPENQUERY (OracleSvr, 'SELECT name FROM joe.titles WHERE id = 101') 
SET name = 'ADifferentName';

3. INSERT 통과 쿼리 실행

다음 예에서는 예 1에서 만든 연결된 서버에 대해 INSERT 통과 쿼리를 사용합니다.

INSERT OPENQUERY (OracleSvr, 'SELECT name FROM joe.titles')
VALUES ('NewTitle');

4. DELETE 통과 쿼리 실행

다음 예에서는 DELETE 통과 쿼리를 사용하여 예 3에서 삽입된 행을 삭제합니다.


'IT > MS-SQL' 카테고리의 다른 글

결과에 영향을 주는 SET 옵션  (0) 2011.05.17
SP 실행 권한 문제  (0) 2011.03.08
MSSQL 단축키  (0) 2011.03.02
내부 프로시저 실행시킬 때 EXECUTE 주의점  (0) 2011.02.28
MSSQL SELECT절에서 두번째로 높은 값 찾기  (0) 2011.02.24
AND

계산 열의 인덱싱된 뷰와 인덱스는 나중에 참조하기 위해 데이터베이스에 결과를 저장합니다. 저장된 결과는 인덱싱된 뷰 또는 인덱싱된 계산 열을 참조하는 모든 연결이 해당 인덱스를 만든 연결과 동일한 결과 집합을 생성할 수 있는 경우에만 유효합니다. 저장된 결과가 올바르게 유지 관리되도록 하고 일관된 결과를 반환하도록 하려면 다음 조건이 발생할 때마다 다음 표의 SET 옵션을 필요한 값 열에 표시된 값으로 설정해야 합니다.

  • 뷰 또는 계산 열에 대해 인덱스가 생성됩니다.

  • 계산 열이 정의되었고 PERSISTED가 지정되었습니다.

  • INSERT, UPDATE 또는 DELETE 연산에 따라 인덱싱된 뷰 또는 인덱싱된 계산 열에 저장된 데이터 값이 수정됩니다. 여기에는 BCP, DTS, 복제 및 분산 쿼리와 같은 연산이 포함됩니다.

  • 쿼리 최적화 프로그램에서 쿼리 실행 계획의 인덱스를 사용합니다.

  • 인덱싱된 뷰의 경우 ANSI_NULLS 및 QUOTED_IDENTIFIER 옵션은 뷰 메타데이터와 함께 저장되기 때문에 뷰를 만들 때 ON으로 설정되어야 합니다.

    SET 옵션

    필요한 값

    기본 서버 값

    기본
    OLE DB 및 ODBC 값

    기본
    DB-Library 값

    ANSI_NULLS

    ON

    OFF

    ON

    OFF

    ANSI_PADDING

    ON

    ON

    ON

    OFF

    ANSI_WARNINGS*

    ON

    OFF

    ON

    OFF

    ARITHABORT

    ON

    ON

    OFF

    OFF

    CONCAT_NULL_YIELDS_NULL

    ON

    OFF

    ON

    OFF

    NUMERIC_ROUNDABORT

    OFF

    OFF

    OFF

    OFF

    QUOTED_IDENTIFIER

    ON

    OFF

    ON

    OFF

    *데이터베이스 호환성 수준이 90 이상으로 설정된 경우 ANSI_WARNINGS를 ON으로 설정하면 암시적으로 ARITHABORT가 ON으로 설정됩니다. 데이터베이스 호환성 수준이 80 이하로 설정된 경우에는 명시적으로 ARITHABORT 옵션을 ON으로 설정해야 합니다.

SET 옵션을 잘못 설정하면 다음 상황이 발생할 수 있습니다.

  • 데이터베이스 엔진에서 오류를 생성하고 인덱스에 저장된 데이터 값을 변경하는 INSERT, UPDATE 또는 DELETE 문을 롤백합니다.

  • 쿼리 최적화 프로그램에서 Transact-SQL 문의 실행 계획에 있는 인덱스를 고려하지 않습니다.

  • 인덱싱된 뷰 또는 계산 열을 만들 수 없습니다.

OLE DB 및 ODBC 연결의 SET 옵션 설정

SQL Server Management Studio, Integration Services, 복제 및 대량 복사 작업을 비롯한 대부분의 응용 프로그램에서는 SQL Server용 OLE DB 공급자나 SQL Server ODBC 드라이버를 사용하여 SQL Server 인스턴스에 연결합니다. OLE DB 및 ODBC 기본 설정은 뷰 또는 계산 열의 인덱스에 필요한 6개의 SET 옵션에 대해 올바릅니다. OLE DB 및 ODBC의 기본값은 위의 표를 참조하십시오. 또한 이러한 설정은 ISO 표준 규칙에 따르므로 SQL Server에 권장되는 설정입니다. 자세한 내용은 클라이언트 네트워크 구성참조하십시오.

참고

SQL Server의 일부 유틸리티는 하나 이상의 ANSI 설정을 OFF로 지정하여 이전 버전의 유틸리티와 호환되도록 합니다.

DB-Library 및 C 언어용 Embedded SQL 연결을 위한 SET 옵션 설정

DB-Library 및 C 언어용 Embedded SQL 응용 프로그램에서는 기본적으로 세션 옵션을 설정하지 않습니다. 이러한 API를 사용하는 시스템에서는 적절한 SET 문을 실행하도록 응용 프로그램을 코딩하거나 데이터베이스 또는 서버의 기본값을 올바른 설정으로 변경해야 합니다.

옵션 설정의 우선 순위

SET 옵션의 ON 또는 OFF 설정은 여러 수준으로 지정할 수 있습니다. 각 세션 옵션의 마지막 설정은 옵션을 설정하는 우선 순위가 가장 높은 작업에 의해 결정됩니다. 세션 설정 작업의 우선 순위는 다음과 같습니다. 우선 순위가 가장 높은 작업이 목록의 맨 위에 있습니다.

  • 응용 프로그램이 서버에 연결한 다음 SET 문을 실행하여 기본 설정을 명시적으로 덮어쓸 수 있습니다. SET 문은 이전의 모든 설정을 덮어쓰므로 응용 프로그램이 실행될 때 옵션을 동적으로 설정하고 해제하는 데 사용할 수 있습니다. 이러한 옵션 설정은 현재 연결 세션에만 적용할 수 있습니다.

  • OLE DB 및 ODBC 응용 프로그램은 연결 문자열에서 옵션 설정을 지정하여 연결 시 적용되는 옵션 설정을 지정할 수 있습니다. 이러한 옵션 설정은 현재 연결 세션에만 적용할 수 있습니다.

  • 제어판의 ODBC 응용 프로그램 또는 ODBC SQLConfigDataSource 함수를 사용하여 SQL Server ODBC 데이터 원본에 대해 지정한 SET 옵션

  • 데이터베이스의 기본 설정. ALTER DATABASE 또는 SQL Server Management Studio의 개체 탐색기를 사용하여 이 값을 지정할 수 있습니다.

  • 서버의 기본 설정. sp_configure 또는 SQL Server Management Studio의 개체 탐색기를 통해 user options라는 서버 구성 옵션을 설정하여 이 값을 지정할 수 있습니다.

예를 들어 ANSI_NULLS에 대한 ODBC 기본값은 ON이지만 ODBC 연결 문자열에서 이 옵션을 OFF로 설정하거나 데이터베이스에 연결한 후 SET 문을 사용하여 이 값을 무시할 수 있습니다.


저장 프로시저 및 트리거

저장 프로시저와 트리거는 뷰 및 계산 열의 인덱스를 지원하는 데 필요한 6개의 SET 옵션과 작동하도록 작성해야 합니다. SET 옵션이 잘못 설정된 경우에는 쿼리 최적화 프로그램에서 저장 프로시저 또는 트리거에 의해 실행된 SELECT 문의 뷰 또는 계산 열의 인덱스를 사용하지 않습니다. 인덱싱된 뷰 또는 계산 열에 저장된 데이터 값을 수정하는 저장 프로시저 또는 트리거의 INSERT, UPDATE 또는 DELETE 문은 오류를 생성합니다.


고려 사항

SET 문은 세션 옵션을 동적으로 변경하므로 뷰 및 인덱싱된 계산 열에 인덱스가 있는 데이터베이스에서 SET 문을 실행할 경우에는 주의해야 합니다. 예를 들어 응용 프로그램은 인덱싱된 뷰 또는 인덱싱된 계산 열이 참조되도록 허용하는 기본 설정으로 연결을 수립할 수 있습니다. 그러나 이 연결에서 첫 번째 문이 SET ANSI_WARNINGS OFF인 저장 프로시저나 트리거를 호출하면 SET 문은 ANSI_WARNINGS에 대한 이전의 기본값 또는 설정을 덮어쓰게 됩니다. 이 경우 최적화 프로그램에서는 저장 프로시저 또는 트리거의 문을 처리할 때 인덱싱된 뷰나 인덱싱된 계산 열을 모두 무시합니다.

결과 집합에 영향을 줄 수 있는 세 가지 세션 옵션으로는 DATEFIRST, DATEFORMAT 및 LANGUAGE가 있습니다. 이들 옵션의 변경에 영향을 받는 결과를 갖는 함수는 확정적이지 않은 함수로 분류되므로 인덱싱된 뷰 또는 인덱싱된 계산 열에서 사용할 수 없습니다.

'IT > MS-SQL' 카테고리의 다른 글

OPENQUERY  (0) 2011.05.18
SP 실행 권한 문제  (0) 2011.03.08
MSSQL 단축키  (0) 2011.03.02
내부 프로시저 실행시킬 때 EXECUTE 주의점  (0) 2011.02.28
MSSQL SELECT절에서 두번째로 높은 값 찾기  (0) 2011.02.24
AND


SP를 실행하는데 다음과 같은 에러가 발생할 경우

229\rThe EXECUTE permission was denied .......
OR
서버: 메시지 229, 수준 14, 상태 5 프로시저 xp_mapdown_bitmap, 선 45
EXECUTE 권한이 개체 'xp_mapdown_bitmap', '마스터' 데이터베이스, 소유자 'dbo' 거부되었습니다
.

<Solution>
SP 실행 권한 없기 때문에 생기는 문제.
쿼리 분석기를 사용하여 수동으로 부여 공개 권한을 다음과 같이 실행:

USE master
GO
GRANT EXECUTE ON xp_mapdown_bitmap TO public
GO

'IT > MS-SQL' 카테고리의 다른 글

OPENQUERY  (0) 2011.05.18
결과에 영향을 주는 SET 옵션  (0) 2011.05.17
MSSQL 단축키  (0) 2011.03.02
내부 프로시저 실행시킬 때 EXECUTE 주의점  (0) 2011.02.28
MSSQL SELECT절에서 두번째로 높은 값 찾기  (0) 2011.02.24
AND