Pergunta

DBMS Fornecedores dialeto uso SQL apresenta para diferenciar seu produto, ao mesmo tempo que afirmam padrões suporte SQL. 'Nuff disse sobre este assunto.

Existe algum exemplo de SQL que você tenha codificado que não pode ser traduzido para SQL: 2008 Standard SQL

Para ser mais específico, eu estou falando sobre DML (a instrução de consulta), NÃO DDL, armazenados sintaxe procedimento ou qualquer coisa que não é uma instrução SQL puro.

Eu também estou falando de consultas que você usaria na produção, não para coisas ad-hoc.

Editar janeiro 13

Obrigado por todas as suas respostas: eles me transmitiu a impressão de que um monte de SQL específicas do DBMS é criado para permitir soluções alternativas para o projeto relacional pobres. O que me leva à conclusão de que você provavelmente não deseja para a porta aplicações mais existentes.

Foi útil?

Solução

diferenças típicas incluem semântica sutilmente differnt (por exemplo, a Oracle lida com NULLs diferentemente de outros dialetos SQL em alguns casos), diferentes mecanismos de tratamento de exceções, diferentes tipos e métodos proprietários para fazer coisas como operações de cadeia, operações de data ou consultas hierárquicas. Dicas de consulta também tendem a ter sintaxe que varia entre plataformas e diferentes optimisers pode ficar confuso em diferentes tipos de construções.

Pode-se usar ANSI SQL para a maior parte em sistemas de banco de dados e espera obter resultados razoáveis ??em um banco de dados, sem problemas de ajuste significativas como índices ausentes. No entanto, em qualquer aplicativo não-trivial não é provável que seja algum requisito para o código que não pode ser feito facilmente portável.

Normalmente, este requisito será bastante localizadas dentro de uma base de código do aplicativo - um punhado de consultas onde isso causa um problema. Os relatórios são muito mais propensos a vomitar este tipo de problema e fazer consultas de relatórios genéricos que funcionam em gerentes de banco de dados é muito improvável que funcione bem. Algumas aplicações são mais susceptíveis de causar sofrimento do que outros.

Portanto, é improvável que confiar em construções SQL 'portáteis' de um aplicativo irá funcionar no caso geral. Uma estratégia melhor é usar declarações genéricas, onde eles vão trabalhar e sair para uma camada específica banco de dados onde isso não funciona.

Um mecanismo de consulta genérica poderia ser usar ANSI SQL sempre que possível; outra abordagem possível seria a utilização de um / mapper R O, o que pode levar drivers para várias plataformas de banco de dados. Este tipo de mecanismo deve ser suficiente para a maioria das operações de banco de dados, mas vai exigir que você para fazer algum trabalho de plataforma specifc onde ele é executado fora do vapor.

Você pode ser capaz de usar procedimentos armazenados como uma camada de abstração para operações e código mais complexo um conjunto de sprocs plataforma específicas para cada plataforma de destino. Os sprocs pode ser acessado através de algo como ADO.net.

Na prática, as diferenças sutis na passagem paramter e tratamento de exceção pode causar problemas com esta abordagem. Uma abordagem melhor é para produzir um módulo que envolve o operações de banco de dados específicos da plataforma com uma interface comum. Diferentes módulos 'Driver' podem ser trocados dentro e fora, dependendo do que DBMS plataforma que você está usando.

Outras dicas

A Oracle tem algumas adições, como modelar ou hierárquica consultas que são muito difícil, se não impossível, para traduzir em SQL puro

Mesmo quando o SQL: 2008 pode fazer algo, por vezes, a sintaxe não é o mesmo. Tome a sintaxe REGEXP correspondência por exemplo, SQL:. 2008 usa LIKE_REGEX vs REGEXP do MySQL

E sim, eu concordo, é muito chato.

Parte do problema com a Oracle é que ele ainda está baseado no padrão ANSI SQL 1992. SQL Server está no padrão SQL 1999, então algumas das coisas que se parecem com "extensões" estão em padrões mais recentes fatos. (Eu acredito que a cláusula "OVER" é uma delas.)

A Oracle é também muito mais restritiva sobre a colocação de subqueries no SQL. SQL Server é muito mais flexível e permissiva sobre permitir subconsultas em quase qualquer lugar.

SQL Server tem uma forma racional para selecionar a linha "top" de um resultado: "SELECT TOP 1 de clientes ORDER BY SALES_TOTAL". No Oracle, este torna-se "SELECT * FROM (clientes a selecionar ORDER BY SALES_TOTAL) ONDE ROW_NUMBER <= 1".

E, claro, há sempre infame SELECT da Oracle (expressão) FROM DUAL.

Editar para adicionar:

Agora que estou no trabalho e pode acessar alguns dos meus exemplos, aqui está uma boa. Este é gerado pelo LINQ to SQL, mas é uma consulta limpa para selecionar linhas 41 até 50 de uma tabela, após a triagem. Ele usa a cláusula "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]

Common aqui no SO

Para responder exatamente:

ISNULL pode facilmente dar resultados diferentes como COALESCE no SQL Server por causa do tipo de dados precedência, como por meu resposta / comentários aqui

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top