Pregunta

Los vendedores de DBMS utilizan características del dialecto SQL para diferenciar su producto, al mismo tiempo que afirma soportar los estándares SQL. 'Nuff dijo en este sentido.

¿Hay algún ejemplo de SQL que ha codificado que no se puede traducir a SQL: 2008 estándar SQL

Para ser más específicos, estoy hablando de LMD (una sentencia de consulta), NO DDL, la sintaxis procedimiento almacenado o cualquier cosa que no es una instrucción SQL puro.

También estoy hablando acerca de las consultas que usaría en la producción, no para cosas ad-hoc.

Editar Ene 13

Gracias por todas sus respuestas: que me ha transmitido de una impresión que se crea una gran parte del SQL DBMS específicos para permitir soluciones temporales para mal diseño relacional. Lo que me lleva a la conclusión de que probablemente no que desee para trasladar las aplicaciones más actuales.

¿Fue útil?

Solución

diferencias típicas incluyen la semántica sutilmente diferentes personas (por ejemplo, Oracle maneja valores NULL diferente de otros dialectos SQL en algunos casos), los diferentes mecanismos de manejo de excepciones, diferentes tipos y métodos propietarios para hacer las cosas como las operaciones de cadenas, operaciones de fecha o consultas jerárquicas. sugerencias de consulta también tienden a tener sintaxis que varía a través de plataformas, y diferentes optimizadores pueden confundirse en diferentes tipos de construcciones.

Uno puede usar ANSI SQL en su mayor parte a través de sistemas de bases de datos y esperar obtener resultados razonables en una base de datos sin problemas de ajuste significativos como los índices que faltan. Sin embargo, en cualquier aplicación no trivial no es probable que haya algún requisito de código que no puede fácilmente ser hecho de forma portátil.

Por lo general, este requisito será bastante localiza dentro de una base de código de la aplicación - un puñado de consultas en las que esto causa un problema. Los informes son mucho más propensos a vomitar este tipo de problema y hacer consultas de informes genéricos que funcionan a través de los administradores de bases de datos es muy poco probable que funcione bien. Algunas aplicaciones son más propensos a causar pena que otros.

Por lo tanto, es poco probable que confiar en construcciones SQL 'portátiles' para una aplicación funcionará en el caso general. Una mejor estrategia es usar comandos genéricos donde van a trabajar y salir a una capa específica de base de datos, donde esto no funciona.

Un mecanismo de consulta genérica podría ser el uso de ANSI SQL cuando sea posible; Otro posible enfoque sería el uso de un O / mapper R, que puede tomar controladores para varias plataformas de base de datos. Este tipo de mecanismo debería ser suficiente para la mayoría de las operaciones de base de datos, pero será necesario que para hacer un trabajo de plataforma specifc donde se queda sin vapor.

Usted puede ser capaz de utilizar los procedimientos almacenados como una capa de abstracción para operaciones más complejas y el código de un conjunto de sprocs específicos de la plataforma para cada plataforma de destino. Los procedimientos almacenados se puede acceder a través de algo así como ADO.net.

En la práctica, las diferencias sutiles en paso Parámetro y manejo de excepciones pueden causar problemas con este enfoque. Un mejor enfoque es producir un módulo que envuelve el operaciones de bases de datos específicas de la plataforma con una interfaz común. módulos diferentes 'conductor' se pueden enchufar y desenchufar dependiendo de qué plataforma DBMS que está utilizando.

Otros consejos

Oracle tiene algunas adiciones, tales como modelo o jerárquica consultas que son muy difícil, si no imposible, de traducir en pura SQL

Aún cuando SQL: 2008 se puede hacer algo a veces la sintaxis no es lo mismo. Tome la sintaxis REGEXP coincidente por ejemplo, SQL:. 2008 utiliza LIKE_REGEX vs REGEXP de MySQL

Y sí, estoy de acuerdo, es muy molesto.

Parte del problema con Oracle es que todavía está basado en el estándar ANSI SQL 1992. SQL Server es el estándar SQL 1999, por lo que algunas de las cosas que se ven como "extensiones" son de hecho las normas más recientes. (Creo que la cláusula "OVER" es uno de ellos.)

Oracle también es mucho más restrictiva sobre la colocación de subconsultas en SQL. SQL Server es mucho más flexible y permisivo en cuanto a permitir subconsultas en casi cualquier lugar.

SQL Server tiene una forma racional para seleccionar la fila "superior" de un resultado: "SELECT TOP 1 de clientes ORDER BY SALES_TOTAL". En Oracle, esto se convierte en "SELECT * FROM (SELECT CLIENTES ORDER BY SALES_TOTAL) DONDE ROW_NUMBER <= 1".

Y, por supuesto, siempre hay infame SELECT de Oracle (expresión) FROM DUAL.

Editar para añadir:

Ahora que estoy en el trabajo y tener acceso a algunos de mis ejemplos, aquí hay una buena. Esto es generado por LINQ a SQL, pero es una consulta limpia para seleccionar filas 41 a la 50 de una tabla, después de la clasificación. Se utiliza la 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]

Común aquí en SO

Para responder con exactitud:

ISNULL puede fácilmente dar diferentes resultados como COALESCE en SQL Server, ya que de tipo de datos precedencia, como por mi respuesta / comentarios aquí

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top