Che cosa significa per “funzioni definite dall'utente non deterministico può essere utilizzato in modo deterministico”?

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

Domanda

Secondo MSDN SQL BOL (Books Online) pagina su funzioni deterministiche e non deterministiche , funzioni non deterministici possono essere utilizzate " in modo deterministico "

  

Le seguenti funzioni non sono sempre deterministico, ma possono essere utilizzati in viste indicizzate o indici su colonne calcolate quando sono specificate in modo deterministico.

Che cosa significa per funzioni non deterministiche può essere utilizzato in modo deterministico ?
Qualcuno può illustrare come che si può fare? e dove si dovrebbe fare così?

È stato utile?

Soluzione

BOL in realtà afferma:

  

Le seguenti funzioni sono non   sempre deterministico , ma può essere   utilizzato in viste indicizzate o indici su   colonne calcolate quando sono   indicate in un modo deterministico.

e poi sotto di esso stabilisce quali condizioni devono essere soddisfatte per renderli deterministica.

per es.

  

CAST - deterministica a meno utilizzato con   datetime, smalldatetime o   sql_variant

In altre parole è necessario per soddisfare coloro condizione di utilizzarli in modo deterministico

Per esempio, quando si crea una tabella

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]

è possibile applicare indice su castIntToVarchar, ma se si tenta di aggiungere indice castDateTimeToInt o castIntToDateTime si otterrà il seguente errore:

Colonna 'castDateTimeToInt' (castIntToDateTime) nella tabella 'dbo.deterministicTest' non possono essere utilizzati in un indice o nelle statistiche oppure come chiave di partizione, perché è non deterministica.

Quindi la dateTime non può essere utilizzato né come fonte né il formato di destinazione della funzione CONVERT, se si vuole rimanere deterministica

Altri suggerimenti

Tale funzione è deterministico significa che è garantito sempre per restituire il medesimo valore di uscita per gli stessi parametri di input.

Utilizzando una funzione non deterministica in modo deterministico presumo significa che ci si assicura che la gamma di argomenti si passa alla funzione è tale che il valore restituito sarà deterministico, cioè. dipendente opon solo tali argomenti.

Ciò che questo comporta in pratica dipende da ciò che la funzione fa e in che modo è non deterministica.

Un esempio:

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

vs

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

Si noti questo utilizza la definizione del articolo di MSDN della parola "deterministico"

Definizioni BOL dovrebbe leggere:

”funzioni deterministici restituiscono sempre lo stesso risultato sulla stessa riga ogni volta che vengono chiamati con uno specifico set di valori di input (riga) e dato lo stesso stato del database.

In altre parole funzioni deterministiche restituiscono sempre lo stesso risultato in un particolare valore fisso dal proprio dominio (in questo caso dominio è una riga).

funzioni non deterministiche possono restituire risultati diversi ogni volta che vengono chiamati con uno specifico set di valori di input (riga) anche se lo stato del database che accedono rimane la stessa.

In questo caso le funzioni non deterministiche

a) restituire valori diversi ogni volta hanno chiamato.

b) dipendono dai valori al di fuori della fila essi applicati.

Esempi del gruppo a):. NEWID (), GETDATE (), GETUTDATE (), RAND () senza seme specificato

Esempi di gruppo B): GET_TRANSMISSION_STATUS (), GAL (), RANK (), DENSE_RANK (), ROW_NUMBER (), NTILE (), SUM () quando specificato con il SOPRA e ORDER BY. “

Si prega di notare che alcuni autori usano diversa definizione di funzioni deterministiche che possono causare confusione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top