Ho imparato funzioni e stored procedure per un bel po 'ma non so perché e quando dovrei usare una funzione o una procedura memorizzata. Mi sembrano uguali, forse perché sono un po 'alle prime armi.
Qualcuno può dirmi perché?
Ho imparato funzioni e stored procedure per un bel po 'ma non so perché e quando dovrei usare una funzione o una procedura memorizzata. Mi sembrano uguali, forse perché sono un po 'alle prime armi.
Qualcuno può dirmi perché?
Risposte:
Le funzioni sono valori calcolati e non possono apportare modifiche ambientali permanenti a SQL Server
(ovvero, nessuna INSERT
o UPDATE
affermazione consentita).
Una funzione può essere utilizzata in linea nelle SQL
istruzioni se restituisce un valore scalare o può essere unita se restituisce un set di risultati.
Un punto degno di nota dai commenti, che riassumono la risposta. Grazie a @Sean K Anderson:
Le funzioni seguono la definizione di informatica in quanto DEVONO restituire un valore e non possono alterare i dati che ricevono come parametri (gli argomenti). Le funzioni non possono modificare nulla, devono avere almeno un parametro e devono restituire un valore. I proc memorizzati non devono avere un parametro, possono cambiare gli oggetti del database e non devono restituire un valore.
Come chiamare la SQL
funzione dalla procedura di archiviazione e quando utilizziamo una funzione anziché la procedura memorizzata.
Ciao amici, oggi discuteremo quando utilizzare la stored procedure e quando utilizzare la funzione. In team semplice Se si desidera calcolare alcuni valori, verrà restituito un singolo valore, quindi non è richiesto:
https://programmingtechtutorial.blogspot.com/2020/01/when-use-storeprocedure-and-when-use.html
La differenza tra SP e UDF è elencata di seguito:
+---------------------------------+----------------------------------------+
| Stored Procedure (SP) | Function (UDF - User Defined |
| | Function) |
+---------------------------------+----------------------------------------+
| SP can return zero , single or | Function must return a single value |
| multiple values. | (which may be a scalar or a table). |
+---------------------------------+----------------------------------------+
| We can use transaction in SP. | We can't use transaction in UDF. |
+---------------------------------+----------------------------------------+
| SP can have input/output | Only input parameter. |
| parameter. | |
+---------------------------------+----------------------------------------+
| We can call function from SP. | We can't call SP from function. |
+---------------------------------+----------------------------------------+
| We can't use SP in SELECT/ | We can use UDF in SELECT/ WHERE/ |
| WHERE/ HAVING statement. | HAVING statement. |
+---------------------------------+----------------------------------------+
| We can use exception handling | We can't use Try-Catch block in UDF. |
| using Try-Catch block in SP. | |
+---------------------------------+----------------------------------------+
Le funzioni e le stored procedure hanno scopi separati. Sebbene non sia la migliore analogia, le funzioni possono essere viste letteralmente come qualsiasi altra funzione che useresti in qualsiasi linguaggio di programmazione, ma i proc memorizzati sono più simili a singoli programmi o uno script batch.
Le funzioni normalmente hanno un output e opzionalmente input. L'output può quindi essere utilizzato come input per un'altra funzione (un SQL Server integrato come DATEDIFF, LEN, ecc.) O come predicato di una query SQL, ad esempio SELECT a, b, dbo.MyFunction(c) FROM table
oppure SELECT a, b, c FROM table WHERE a = dbo.MyFunc(c)
.
I proc memorizzati vengono utilizzati per associare query SQL in una transazione e interfacciarsi con il mondo esterno. Frame come ADO.NET, ecc. Non possono chiamare direttamente una funzione, ma possono chiamare direttamente un proc memorizzato.
Le funzioni presentano tuttavia un pericolo nascosto: possono essere utilizzate in modo improprio e causare problemi di prestazioni piuttosto sgradevoli: considerare questa query:
SELECT * FROM dbo.MyTable WHERE col1 = dbo.MyFunction(col2)
Dove MyFunction è dichiarato come:
CREATE FUNCTION MyFunction (@someValue INTEGER) RETURNS INTEGER
AS
BEGIN
DECLARE @retval INTEGER
SELECT localValue
FROM dbo.localToNationalMapTable
WHERE nationalValue = @someValue
RETURN @retval
END
Quello che succede qui è che la funzione MyFunction viene chiamata per ogni riga nella tabella MyTable. Se MyTable ha 1000 righe, allora ci sono altre 1000 query ad hoc sul database. Allo stesso modo, se la funzione viene chiamata quando specificato nelle specifiche della colonna, la funzione verrà chiamata per ogni riga restituita da SELECT.
Quindi devi essere attento alle funzioni di scrittura. Se selezioni SELECT da una tabella in una funzione, devi chiederti se può essere eseguito meglio con un JOIN nel proc memorizzato principale o in qualche altro costrutto SQL (come CASE ... WHEN ... ELSE ... FINE).
SELECT * from dbo.MyTableValuedFunction()
. Sprocs, d'altra parte, può essere chiamato direttamente con ADO.NET impostando SqlCommand.CommandType
su CommandType.StoredProcedure
.
Differenze tra procedure memorizzate e funzioni definite dall'utente:
RAISEERROR
O @@ERROR
non sono ammessi negli UDF.GETDATE()
non può essere utilizzato negli UDF.GETDATE()
può essere utilizzato in una funzione. Il perno su Non deterministico non è buono.
Scrivere una funzione definita dall'utente quando si desidera calcolare e restituire un valore da utilizzare in altre istruzioni SQL; scrivere una procedura memorizzata quando si desidera invece è di raggruppare un insieme forse complesso di istruzioni SQL. Questi sono due casi d'uso piuttosto diversi, dopo tutto!
STORE PROCEDURE FUNCTION (USER DEFINED FUNCTION)
* Procedure can return 0, single or | * Function can return only single value
multiple values. |
|
* Procedure can have input, output | * Function can have only input
parameters. | parameters.
|
* Procedure cannot be called from | * Functions can be called from
function. | procedure.
|
* Procedure allows select as well as | * Function allows only select statement
DML statement in it. | in it.
|
* Exception can be handled by | * Try-catch block cannot be used in a
try-catch block in a procedure. | function.
|
* We can go for transaction management| * We can't go for transaction
in procedure. | management in function.
|
* Procedure cannot be utilized in a | * Function can be embedded in a select
select statement | statement.
|
* Procedure can affect the state | * Function can not affect the state
of database means it can perform | of database means it can not
CRUD operation on database. | perform CRUD operation on
| database.
|
* Procedure can use temporary tables. | * Function can not use
| temporary tables.
|
* Procedure can alter the server | * Function can not alter the
environment parameters. | environment parameters.
|
* Procedure can use when we want | * Function can use when we want
instead is to group a possibly- | to compute and return a value
complex set of SQL statements. | for use in other SQL
| statements.
Differenza di base
La funzione deve restituire un valore ma in Stored procedure è facoltativa (la procedura può restituire zero o n valori).
Le funzioni possono avere solo parametri di input, mentre le procedure possono avere parametri di input / output.
La funzione accetta un parametro di input è obbligatoria ma la Stored Procedure può richiedere da o a n parametri di input.
Le funzioni possono essere richiamate dalla procedura mentre le procedure non possono essere richiamate dalla funzione.
Differenza anticipata
La procedura consente l'istruzione SELECT e DML (INSERT / UPDATE / DELETE) in essa, mentre la funzione consente solo l'istruzione SELECT in essa.
Le procedure non possono essere utilizzate in un'istruzione SELECT mentre la funzione può essere incorporata in un'istruzione SELECT.
Le stored procedure non possono essere utilizzate nelle istruzioni SQL in nessun punto della sezione WHERE / HAVING / SELECT, mentre la funzione può essere.
Le funzioni che restituiscono tabelle possono essere trattate come un altro set di righe. Questo può essere usato in JOIN con altre tabelle.
La funzione incorporata può essere considerata come vista che accetta parametri e può essere utilizzata in JOIN e altre operazioni di Rowset.
L'eccezione può essere gestita dal blocco try-catch in una procedura mentre il blocco try-catch non può essere utilizzato in una funzione.
Possiamo andare per la gestione delle transazioni in procedura mentre non possiamo andare in funzione.
Returns
parola chiave e deve essere un tipo scalare o di tabella) , ma le procedure memorizzate possono facoltativamente restituire: a) 1 Int
tipo di codice risultato tramite l' Return
istruzione e / o b) 1+ parametri (incl. Cursor
tipo) tramite la Output
parola chiave e / o c) 1+ set di righe tramite Select
istruzioni. Se solo 1 set di righe viene restituito, può essere utilizzato come argomento "execute_statement" di un'istruzione "Inserisci in". "
una funzione definita dall'utente è uno strumento importante disponibile per un programmatore di server sql. È possibile utilizzarlo in linea in un'istruzione SQL in questo modo
SELECT a, lookupValue(b), c FROM customers
dove lookupValue
sarà un UDF. Questo tipo di funzionalità non è possibile quando si utilizza una procedura memorizzata. Allo stesso tempo, non è possibile eseguire determinate operazioni all'interno di un UDF. La cosa fondamentale da ricordare qui è che UDF:
una procedura memorizzata può fare queste cose.
Per me l'uso in linea di un UDF è l'uso più importante di un UDF.
Le Stored procedure sono utilizzate come script . Eseguono una serie di comandi per te e puoi programmarli per l'esecuzione in determinati momenti. Di solito esegue istruzioni DML multiple come INSERT, UPDATE, DELETE, ecc. O addirittura SELECT.
Le funzioni sono usate come metodi. Gli passi qualcosa e restituisce un risultato. Dovrebbe essere piccolo e veloce - lo fa al volo. Solitamente utilizzato in un'istruzione SELECT.
Procedura memorizzata:
EXEC
o EXECUTE
istruzione.OUT
parametro.Funzione:
Può essere utilizzato solo per selezionare i record. Tuttavia, può essere chiamato molto facilmente dall'interno di SQL standard, come ad esempio:
SELECT dbo.functionname('Parameter1')
o
SELECT Name, dbo.Functionname('Parameter1') FROM sysObjects
Per semplici operazioni di selezione riutilizzabili, le funzioni possono semplificare il codice. Diffida solo dall'uso delle JOIN
clausole nelle tue funzioni. Se la tua funzione ha una JOIN
clausola e la chiami da un'altra istruzione select che restituisce più risultati, quella funzione chiamerà JOIN
quelle tabelle insieme per ogni linea restituita nel set di risultati. Quindi, sebbene possano essere utili per semplificare un po 'di logica, possono anche essere un collo di bottiglia delle prestazioni se non vengono utilizzati correttamente.
OUT
parametroFunzione definita dall'utente.
Stored procedure
Per decidere quando utilizzare quali potrebbero essere utili i seguenti punti:
Le procedure memorizzate non possono restituire una variabile di tabella in cui come funzione può farlo.
È possibile utilizzare le procedure memorizzate per modificare i parametri dell'ambiente server in cui non è possibile utilizzare le funzioni.
Saluti
Le funzioni di SQL Server, come i cursori, sono pensate per essere utilizzate come ultima arma! Hanno problemi di prestazioni e quindi l'uso di una funzione con valori di tabella dovrebbe essere evitato il più possibile. Parlare di prestazioni è parlare di una tabella con oltre 1.000.000 di record ospitati su un server su un hardware di classe media; in caso contrario, non è necessario preoccuparsi dell'hit di performance causato dalle funzioni.
per ulteriori riferimenti consultare: http://database.aspfaq.com/database/should-i-use-a-view-a-stored-procedure-or-a-user-defined-function.html
Inizia con funzioni che restituiscono un singolo valore. La cosa bella è che puoi inserire il codice usato di frequente in una funzione e restituirlo come colonna in un set di risultati.
Quindi, è possibile utilizzare una funzione per un elenco di città con parametri. dbo.GetCitiesIn ("NY") Restituisce una tabella che può essere utilizzata come join.
È un modo di organizzare il codice. Sapere quando qualcosa è riutilizzabile e quando è una perdita di tempo è qualcosa che si ottiene solo attraverso prove, errori ed esperienze.
Inoltre, le funzioni sono una buona idea in SQL Server. Sono più veloci e possono essere abbastanza potenti. Selezioni in linea e dirette. Attento a non abusare.
Ecco un motivo pratico per preferire le funzioni alle procedure memorizzate. Se si dispone di una procedura memorizzata che richiede i risultati di un'altra procedura memorizzata, è necessario utilizzare un'istruzione insert-exec. Ciò significa che è necessario creare una tabella temporanea e utilizzare exec
un'istruzione per inserire i risultati della procedura memorizzata nella tabella temporanea. È disordinato. Un problema con questo è che insert-execs non può essere nidificato .
Se sei bloccato con le procedure memorizzate che chiamano altre stored procedure, potresti imbatterti in questo. Se la stored procedure nidificata restituisce semplicemente un set di dati, può essere sostituita con una funzione con valori di tabella e non verrà più visualizzato questo errore.
( questo è un altro motivo per cui dovremmo tenere la logica di business fuori dal database )
Le funzioni possono essere utilizzate in un'istruzione select in cui non è possibile eseguire le procedure.
La procedura memorizzata accetta sia i parametri di input che di output, ma Functions accetta solo i parametri di input.
Le funzioni non possono restituire valori di tipo text, ntext, image & timestamps dove possibile.
Le funzioni possono essere utilizzate come tipi di dati definiti dall'utente nella tabella di creazione, ma le procedure no.
*** Ad esempio: -create table <tablename>(name varchar(10),salary getsal(name))
Qui getsal è una funzione definita dall'utente che restituisce un tipo di stipendio, quando viene creata una tabella non viene assegnata alcuna memoria per il tipo di stipendio e anche la funzione getal non viene eseguita, ma quando stiamo recuperando alcuni valori da questa tabella, la funzione getal viene eseguita e il return Type viene restituito come set di risultati.
Mi rendo conto che questa è una domanda molto antica, ma non vedo un aspetto cruciale menzionato in nessuna delle risposte: l'inserimento nel piano di query.
Le funzioni possono essere ...
Scalare:
CREATE FUNCTION ... RETURNS scalar_type AS BEGIN ... END
Tabella a più istruzioni valutata:
CREATE FUNCTION ... RETURNS @r TABLE(...) AS BEGIN ... END
Tabella in linea valutata:
CREATE FUNCTION ... RETURNS TABLE AS RETURN SELECT ...
Il terzo tipo (inline con valori di tabella) viene trattato da Query Optimizer essenzialmente come viste (parametrizzate), il che significa che fare riferimento alla funzione dalla query è simile a incollare il corpo SQL della funzione (senza effettivamente incollare la copia), portando ai seguenti vantaggi:
Quanto sopra può portare a risparmi sulle prestazioni potenzialmente significativi, specialmente quando si combinano più livelli di funzioni.
NOTA: sembra che SQL Server 2019 introdurrà anche una qualche forma di allineamento delle funzioni scalari .
In SQL Server, funzioni e stored procedure sono due diversi tipi di entità.
Funzione: nel database di SQL Server, le funzioni vengono utilizzate per eseguire alcune azioni e l'azione restituisce immediatamente un risultato. Le funzioni sono di due tipi:
Sistema definito
Definito dall'utente
Stored procedure: in SQL Server, le stored procedure sono archiviate nel server e possono restituire zero, valori singoli e multipli. Le Stored procedure sono di due tipi: