Oggi mi sono imbattuto in un problema interessante. Stavo alterando una procedura memorizzata e ho messo un'istruzione select alla fine. Doveva essere temporaneo e solo per lavorare con i dati. Sono stato sorpreso di scoprire più tardi che la dichiarazione è stata salvata ed era in esecuzione ogni volta che la SP funzionava.Dichiarazioni dopo END in stored procedure
SET ANSI_NULLS ON
GO
-- Comments usually go here and are saved as part of the SP
ALTER PROCEDURE [dbo].[MySP]
@param INT
AS
BEGIN
--Your normal SQL statements here
END
--You can also add SQL statements here
select * from LargeTable
--You have access to the params
select @param
ha senso che tutto viene salvato, non solo ciò che è dentro BEGIN/END, altrimenti i commenti e SET ANSI_NULLS
, ecc scomparirebbe. Sono un po 'confuso con ciò che inizia dove, quindi ho un paio di domande:
SET ANSI_NULLS
viene salvato come parte del SP. Ho confermato che ogni SP ha il suo valore. In che modo SQL Server sa di salvarlo come parte dell'SP poiché non è stato referenziato prima? Esegue una scansione completa dello stato dell'ambiente corrente, quindi quando viene eseguito lo statoALTER PROCEDURE
salva lo stato (probabilmente solo valori non predefiniti)?- Apparentemente BEGIN/END sono opzionali e non hanno alcun significato intrinseco. Perché sono inclusi anche allora? Danno un falso senso dello scope che non esiste. A me non sembra BEGIN/END e un GO alla fine sarebbe più sensato.
BEGIN/END sono usati per scopo, come contenente istruzioni multiple in un if/while/etc. Francamente, TSQL è atroce da lavorare rispetto a PLSQL, che è molto più strutturato/organizzato nel modo in cui utilizza BEGIN/END e utilizza il punto e virgola per terminare le linee. Come TSQL richiede un punto e virgola prima di un WITH/CTE se si dichiarano variabili prima di esso ...:/Chiunque abbia un'esperienza di linguaggio basata su C può ricevere PLSQL e riuscire a leggerlo. Non posso dirlo per TSQL ... –
@OMG - Quindi quale "scope" dà in questo caso? L'unica cosa che posso immaginare è se dichiari una variabile all'interno di BEGIN/END che non è disponibile all'esterno. Perché dovresti mai mettere le dichiarazioni SQL al di fuori; perché non dovresti mettere tutto fuori e no BEGIN/END? –
L'esempio è valido, non ho detto che era sapiente;) –