2009-05-07 4 views
13

Quando si generano gli script di creazione dello schema SQL manualmente di solito si chiama semplicemente "Crea procedura ...", tuttavia noto che quando si genera lo script utilizzando l'opzione Attività/Genera script viene utilizzato "spexecutesql @statement = .." ad es.Perché SQL Server genera stored procedure utilizzando l'istruzione sp_executesql con stringa?

EXEC dbo.sp_executesql @statement = N'-- ============================================= 
    -- Author:  Me 
    -- Create date: 20/03/2009 
    -- Description: Does stuff 
    -- ============================================= 
    CREATE PROCEDURE [dbo].[MyProc] 
     -- Add the parameters for the stored procedure here 
     @StartDate datetime 
    AS 
    BEGIN 
     -- SET NOCOUNT ON added to prevent extra result sets from 
     -- interfering with SELECT statements. 
     SET NOCOUNT ON; 
    ... 
END 
' 

Perché è questo? Si tratta di conservare commenti? Grazie

risposta

18

Non ha nulla a che vedere con i commenti. Lo fa solo quando gli dici di "includere SE NON ESISTE". Il motivo è che può solo includere o escludere a livello di programmazione oggetti se vengono eseguiti dinamicamente.

È possibile disabilitare questa stored procedure selezionando "False" in Opzioni \ Esplora oggetti di SQL Server \ Scripting - Verifica esistenza oggetto.

+4

Non sono sicuro che sia vero. Scrivo spesso le protezioni di tipo "SE NON ESISTE" e non eseguo gli script usando sp_executesql –

+0

Sono abbastanza sicuro che l'approccio non funzionerà per Alter e crea relativi alle stored procedure –

0

Immagino che abbia a che fare con la possibilità di creare più file nello stesso file di script senza GO? Se si crea uno sproc ... direttamente, è necessario completarlo in un batch (terminare con un GO). Con sp_executesql non dovresti avere bisogno di andare negli script generati tra oggetti. Anche se non ricordo, forse ce n'è uno comunque .. (non avere un db di fronte a me).

0

L'utilizzo di spexecutesql è una best practice. Ha a che fare con prevenire l'iniezione sql, ecc. Isolando/limitando l'ambito delle variabili, ecc. Più qui: http://msdn.microsoft.com/en-us/library/ms188001.aspx

Non si deve usare spexecutesql - Anche EXEC funziona - molte persone usano solo semplice vecchio EXEC - non è altrettanto sicuro.

2

Mi rendo conto che questo è vecchio, ma la soluzione è sepolta abbastanza in profondità in Sql 2012. Michael Haren ha ragione, il metodo di rendering sprocs cambia quando sono richiesti controlli di esistenza degli oggetti in Opzioni. Per cambiare questo, andare su Opzioni, Sql Server Object Explorer, Scripting, Object Scripting Options e impostare 'Check for object existence' su false. Sprocs ora esegue il rendering "normalmente", senza utilizzare sp_executesql.

2

sql server 2012, set Strumenti => Opzioni => Oggetto SQL Server Esplora => Scripting, verificare l'esistenza dell'oggetto = false

può risolvere questo problema.

+0

Sì !! Questa è una soluzione per SSMS 2012 – nano

Problemi correlati