2010-04-29 17 views
37

¿Hay constantes en T-SQL como las hay en otros lenguajes que proporcionan los rangos de valores máximo y mínimo de tipos de datos como int?integer Constantes de valor máximo en SQL Server T-SQL?

Tengo una tabla de códigos donde cada fila tiene una columna de rango superior e inferior, y necesito una entrada que representa un rango donde el rango superior es el valor máximo que puede contener int (algo así como un infinito de hackish). Preferiría no codificarlo y usar algo como SET UpperRange = int.Max

+1

** int: ** -2^31 (-2147483648) a 2^31-1 (2147483647) - http://msdn.microsoft.com/en-us/library /ms187745.aspx –

+1

select (2^31) -1, 2147483647 – mnemotronic

Respuesta

11

hay dos opciones:

  • -definida por el usuario escalar f unción
  • propiedades de la tabla

en Oracle, puede hacerlo dentro de Paquetes - el más cercano de SQL Server ha Asambleas es ...

+0

¿Qué es esta tabla de propiedades? Busqué en Google por un tiempo pero no obtuve nada, así que puedo definir un valor constante en las propiedades de una tabla (como suena desde su nombre) que puede usarse para representar int.MaxValue. ¿Puede ayudarme con algún enlace o detalles al respecto? – RBT

+0

@RBT Todo lo que dice es que podría hacer una tabla y tener entradas para los diferentes valores min/max, luego consultar esa tabla. – AaronLS

7

No creo que haya constantes definidas, pero podría definirlas usted mismo almacenando los valores en una tabla o usando una función con valores escalares.

Tabla

instalación de una tabla que tiene tres columnas: TypeName, Max y Min. De esa manera solo tienes que poblarlos una vez.

valor escalar Función

Como alternativa puede usar con valor escalar funciones GetMaxInt() por ejemplo (véase esta StackOverflow answer de un ejemplo real

Puede encontrar todos los valores máx/mín aquí:. http://msdn.microsoft.com/en-us/library/ms187752.aspx

3

Evita escalares Funciones como la peste:
Scalar UDF Performance Problem

Dicho esto, no usaría la tabla de 3 columnas sugerida por otra persona.
Esto causaría conversiones implícitas en cualquier lugar donde lo use.
También tendría que unirse a la mesa varias veces si necesita usarla para más de un tipo.

En lugar de eso, tiene una columna para cada Mín. Y Máx. De cada Tipo de datos (definido con su propio tipo de datos) y los llama directamente para compararlos.

Ejemplo:

SELECT * 
    FROM SomeTable as ST 
    CROSS JOIN TypeRange as TR 
    WHERE ST.MyNumber BETWEEN TR.IntMin AND TR.IntMax 
+2

Puede llamar a la función escalar una sola vez, asignar el resultado a una variable y usar eso como una "constante" en la consulta. Pero tienes razón. Por supuesto: evite llamar a funciones escalares para cada fila de datos. Si tiene muchos datos, este es el verdadero asesino de rendimiento. –

Cuestiones relacionadas