2010-12-14 10 views
16

Tenemos enumeraciones en nuestro código C#:¿Cómo uso las enumeraciones en TSQL sin el número mágico de codificación dura en todos mis scripts/procesos de SQL?

public enum JobStatus 
{   
    Ready = 0,  
    Running = 1,   
    Cancelling = 2, 
} 

Estos valores también se almacenan en campos de la base, y tenemos mucha de TSQL (procsos mayoría almacenados, así como algunos lotes y SSIS) que también procesa los datos:

SELECT TOP 1 @JobSID = JobSID 
FROM Job 
WHERE Status = 0 /* JobStatus.Ready */ 
ORDER BY SubmitDate ASC 

CREATE TABLE ImportCrossEffect(
    /* lots deleted */  
    Source tinyint 
     DEFAULT 1 NOT NULL -- 0: Unknown (default), 1:Imported, 2:Keyed 
) 

¿Cómo evito dura la codificación de los “números mágicos” en el TSQL?
¿Cómo elimino el riesgo de que las enumeraciones no coincidan en los lados C# y TSQL?

(I han incluido la etiqueta C#, como me gustaría solución que “individuales de origen” las definiciones de las enumeraciones tanto en el C# y los lados TSQL)


actualizaciones:

No tenemos tablas en la base de datos con los nombres Enum, los valores solo se almacenan en pequeñas columnas int.

Tenía la esperanza de algo así como un pre-procesador SQL que "expandiría" toda la enumeración hasta allí "valor mágico".

+0

los potros @OMG, me gusta el ideal de utilizar un punto de vista, ya que la vista podría ser generada por los scripts de construcción y siempre es fácil de actualizar vistas en una base de datos. –

Respuesta

0

En TSQL puro, lo único similar que puedo pensar es una UDF escalar que devuelve el valor deseado.

En LINQ to SQL puede asignar miembros como encripciones C# /. NET, y se encarga de ello.

Pero para ser sincero; en la mayoría de los TSQL puros, principalmente usaría los literales.

+0

Gracias, me han dicho que "UDF escalar" es lento, no sé si esto es cierto –

7

Siempre puede pasar el valor de la enumeración al comando/proc almacenado que está intentando ejecutar. De esta manera, nunca tendrá que preocuparse por las enumeraciones en la base de datos.

Si desea almacenar las enumeraciones en la base de datos, entonces le sugiero que crea una vista (posiblemente titulado con su enumeración), así:

create view JobStatus 
    select 0 as Ready, 1 as Running, 2 as Cancelling 

Usted puede entonces tener acceso/unirse en la vista si lo necesitas para.

Nota: el optimizador de consultas trata cualquier referencia a lo anterior como una operación de escaneo/escaneo constante, no una exploración de tabla, por lo que no está incurriendo en las lecturas que ocurrirían si estuviera accediendo a una tabla real.

+0

Para un puñado de valores, es trivial crear la tabla y poblarla. –

+0

Gracias, esto puede funcionar bien para la mayoría de los TSQL, ¿algún ideal sobre cómo eliminar los números mágicos de los valores predeterminados de las columnas? –

1

En un proyecto definimos un atributo que se aplicaba a cada miembro enum que almacenaba la tabla y el valor esperado en la base de datos y las pruebas de la unidad verificaban el enlace. Desordenado sin embargo.

0

¿Quizás podría implementar código administrado en el servidor SQL en lugar de usar el TSQL normal? No estoy 100% seguro de si esto funcionaría, pero podría ser una opción para explorar.

Possible Solution here...

Cuestiones relacionadas