¿Qué significa "las funciones no deterministas definidas por el usuario se pueden utilizar de manera determinista"?

StackOverflow https://stackoverflow.com/questions/709601

Pregunta

Según la página MSDN SQL BOL (Libros en línea) en Funciones deterministas y no deterministas, se pueden utilizar funciones no deterministas "de manera determinista"

Las siguientes funciones no siempre son deterministas, pero se pueden usar en vistas indexadas o índices en columnas calculadas cuando se especifican de manera determinista.

¿Qué significa que se pueden utilizar funciones no deterministas? de manera determinista?
¿Alguien puede ilustrar? cómo eso se puede hacer?y dónde ¿lo harías?

¿Fue útil?

Solución

el BOL en realidad dice:

Las siguientes funciones son no siempre determinista, pero se puede usar en vistas o índices indexados en columnas calculadas cuando se especifican de manera determinista.

y luego debajo indica qué condiciones deben cumplirse para que sean deterministas.

P.ej.

Cast - Determinista a menos que se use con DateTime, SmallDateTime o SQL_Variant

En otras palabras, debes cumplir esas condiciones para usarlos en manera determinista

Por ejemplo cuando creas una tabla

CREATE TABLE [dbo].[deterministicTest](
    [intDate] [int] NULL,
    [dateDateTime] [datetime] NULL,
    [castIntToDateTime]  AS (CONVERT([datetime],[intDate],0)),
    [castDateTimeToInt]  AS (CONVERT([int],[dateDateTime],0)),
    [castIntToVarchar]  AS (CONVERT([varchar],[intDate],0))
) ON [PRIMARY]

puede aplicar el índice en castIntToVarchar pero si intenta agregar un índice a castDateTimeToInt o castIntToDateTime obtendrá el siguiente error:

La columna 'castDateTimeToInt'(castIntToDateTime) de la tabla 'dbo.deterministicTest' no se puede utilizar en un índice o estadísticas ni como clave de partición porque no es determinista.

Por lo tanto, dateTime no se puede utilizar ni como formato de origen ni de destino de la función CONVERTIR si desea seguir siendo determinista.

Otros consejos

Esto es una función determinista significa que se garantiza siempre para devolver el mismo valor de salida para los mismos argumentos de entrada.

Uso de una función no determinista de una manera determinista Asumo medios que se asegure de que la gama de argumentos se pasa a la función es tal que el valor de retorno será determinista, es decir. sólo depende OPON esos argumentos.

Lo que esto implica en la práctica depende de lo que haga la función y de qué manera es no determinista.

Un ejemplo:

RAND(1)  // deterministic, always returns the same number

frente a:

RAND()   // non-deterministic, returns new random number on each call

Tenga en cuenta este utiliza la definición del artículo de MSDN de la palabra "determinista"

Definiciones BOL deben leer:

”Funciones deterministas siempre devuelven el mismo resultado en la misma fila en cualquier momento que se llaman con un conjunto específico de valores de entrada (fila) y se les da el mismo estado de la base de datos.

En otras palabras las funciones deterministas siempre devuelven el mismo resultado en cualquier valor fijo particular, de su dominio (en este caso de dominio es una fila).

funciones deterministas pueden devolver resultados diferentes cada vez que se denominan con un conjunto específico de valores de entrada (fila) incluso si el estado base de datos que tienen acceso sigue siendo el mismo.

En este caso las funciones no deterministas

a) devuelven valores distintos cada vez que llaman.

b) dependen de los valores fuera de la fila que aplica.

Los ejemplos de grupo a):. NEWID (), GETDATE (), GETUTDATE (), RAND () sin semilla especificado

Ejemplos del grupo b): GET_TRANSMISSION_STATUS (), LAG (), RANK (), DENSE_RANK (), ROW_NUMBER (), NTILE (), SUM () cuando especificado con la una y ORDER BY cláusulas. “

Tenga en cuenta que algunos autores utilizan diferentes definición de funciones deterministas que pueden conducir a confusión.

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