문제

DBMS 공급업체는 SQL 방언 기능을 사용하여 제품을 차별화하는 동시에 SQL 표준을 지원한다고 주장합니다.'Nuff는 이에 대해 말했습니다.

SQL:2008 표준 SQL로 변환할 수 없는 코딩한 SQL의 예가 있습니까?

구체적으로 말하면 DML(쿼리 문), NOT DDL, 저장 프로시저 구문 또는 순수 SQL 문이 아닌 모든 것에 대해 이야기하고 있습니다.

또한 임시 작업이 아닌 프로덕션에서 사용할 쿼리에 대해서도 이야기하고 있습니다.

1월 13일 수정

모든 답변에 감사드립니다.그들은 많은 DBMS 관련 SQL이 열악한 관계형 설계에 대한 해결 방법을 허용하기 위해 생성되었다는 인상을 나에게 전달했습니다.당신은 아마도 그렇게 하지 않을 것이라는 결론에 이르게 되었습니다. 원하다 대부분의 기존 애플리케이션을 이식합니다.

도움이 되었습니까?

해결책

일반적인 차이점에는 미묘하게 다른 의미(예: Oracle은 경우에 따라 다른 SQL 방언과 다르게 NULL을 처리함), 다양한 예외 처리 메커니즘, 문자열 작업, 날짜 작업 또는 계층적 쿼리와 같은 작업을 수행하기 위한 다양한 유형 및 독점 방법이 포함됩니다.또한 쿼리 힌트는 플랫폼에 따라 달라지는 구문을 갖는 경향이 있으며 다양한 최적화 프로그램은 다양한 유형의 구문에서 혼동될 수 있습니다.

데이터베이스 시스템 전체에서 대부분 ANSI SQL을 사용할 수 있으며 인덱스 누락과 같은 심각한 튜닝 문제 없이 데이터베이스에서 합리적인 결과를 얻을 수 있을 것으로 기대할 수 있습니다.그러나 중요하지 않은 응용 프로그램에서는 쉽게 이식할 수 없는 코드에 대한 요구 사항이 있을 수 있습니다.

일반적으로 이 요구 사항은 애플리케이션 코드 베이스 내에서 상당히 지역화됩니다. 이로 인해 문제가 발생하는 몇 가지 쿼리가 있습니다.보고는 이러한 유형의 문제를 일으킬 가능성이 훨씬 높으며 데이터베이스 관리자 전체에서 작동하는 일반 보고 쿼리를 수행하는 것은 제대로 작동할 가능성이 거의 없습니다.일부 응용 프로그램은 다른 응용 프로그램보다 슬픔을 유발할 가능성이 더 높습니다.

따라서 일반적인 경우에는 응용 프로그램에 대해 '이식 가능한' SQL 구문을 사용하는 것이 작동하지 않을 것입니다.더 나은 전략은 작동하는 일반 명령문을 사용하고 작동하지 않는 데이터베이스 특정 계층으로 이동하는 것입니다.

일반적인 쿼리 메커니즘은 가능한 경우 ANSI SQL을 사용하는 것입니다.또 다른 가능한 접근 방식은 다양한 데이터베이스 플랫폼용 드라이버를 사용할 수 있는 O/R 매퍼를 사용하는 것입니다.이러한 유형의 메커니즘은 대부분의 데이터베이스 작업에 충분하지만 성능이 부족한 일부 플랫폼별 작업을 수행해야 합니다.

보다 복잡한 작업을 위한 추상화 계층으로 저장 프로시저를 사용하고 각 대상 플랫폼에 대한 플랫폼별 sproc 세트를 코딩할 수 있습니다.sprocs는 ADO.net과 같은 것을 통해 액세스할 수 있습니다.

실제로 매개변수 전달 및 예외 처리의 미묘한 차이로 인해 이 접근 방식에 문제가 발생할 수 있습니다.더 나은 접근 방식은 플랫폼 별 데이터베이스 작업을 공통 인터페이스로 랩핑하는 모듈을 생성하는 것입니다.사용 중인 DBMS 플랫폼에 따라 다양한 '드라이버' 모듈을 교체할 수 있습니다.

다른 팁

Oracle에는 다음과 같은 몇 가지 추가 사항이 있습니다. 모델 또는 계층적 불가능하지는 않더라도 순수한 SQL로 변환하기가 매우 어려운 쿼리

SQL:2008이 어떤 작업을 수행할 수 있는 경우에도 구문이 동일하지 않은 경우가 있습니다.예를 들어 REGEXP 일치 구문을 사용하면 SQL:2008에서는 다음을 사용합니다. LIKE_REGEX vs MySQL의 REGEXP.

그리고 네, 저도 동의합니다. 매우 짜증나는 일입니다.

Oracle의 문제점 중 하나는 Oracle이 여전히 SQL 1992 ANSI 표준을 기반으로 한다는 것입니다.SQL Server는 SQL 1999 표준을 따르므로 "확장"처럼 보이는 것 중 일부는 실제로는 더 새로운 표준입니다.(저는 "OVER" 절이 이 중 하나라고 생각합니다.)

또한 Oracle은 SQL에 하위 쿼리를 배치하는 데 훨씬 더 제한적입니다.SQL Server는 거의 모든 곳에서 하위 쿼리를 허용하는 데 있어서 훨씬 더 유연하고 관대합니다.

SQL Server에는 결과의 "맨 위" 행을 선택하는 합리적인 방법이 있습니다."SALES_TOTAL 기준 고객 주문에서 상위 1개를 선택하세요."Oracle에서는 "SELECT * FROM (SELECT CUSTOMERS ORDER BY SALES_TOTAL) WHERE ROW_NUMBER <= 1"이 됩니다.

물론 Oracle의 악명 높은 SELECT(표현식) FROM DUAL도 항상 있습니다.

추가하려면 편집하세요:

이제 작업 중이고 일부 예제에 액세스할 수 있으므로 여기에 좋은 예제가 있습니다.이는 LINQ-to-SQL에 의해 생성되지만 정렬 후 테이블에서 행 41~50을 선택하는 깔끔한 쿼리입니다."OVER" 절을 사용합니다.

SELECT [t1].[CustomerID], [t1].[CompanyName], [t1].[ContactName], [t1].[ContactTitle], [t1].[Address], [t1].[City], [t1].[Region], [t1].[PostalCode], [t1].[Country], [t1].[Phone], [t1].[Fax]
    FROM (
        SELECT ROW_NUMBER() OVER (ORDER BY [t0].[ContactName]) AS [ROW_NUMBER], [t0].[CustomerID], [t0].[CompanyName], [t0].[ContactName], [t0].[ContactTitle], [t0].[Address], [t0].[City], [t0].[Region], [t0].[PostalCode], [t0].[Country], [t0].[Phone], [t0].[Fax]
        FROM [dbo].[Customers] AS [t0]
        ) AS [t1]
    WHERE [t1].[ROW_NUMBER] BETWEEN 40 + 1 AND 40 + 10
    ORDER BY [t1].[ROW_NUMBER]

여기 SO에서는 공통적입니다.

정확하게 대답하려면:

ISNULL은 데이터 유형 우선 순위로 인해 SQL Server에서 COALESCE로 쉽게 다른 결과를 제공할 수 있습니다. 답변/의견 여기

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top