Pourquoi le server sql génère-t-il des procédures stockées à l'aide de l'instruction sp_executesql avec une string?

Lorsque je génère des scripts de création de schéma sql manuellement, j'appelle simplement 'Créer une procédure …', mais je remarque que lorsque vous générez le script en utilisant l'option Tâches / Générer des scripts, il utilise 'spexecutesql @statement = ..'

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 ' 

Pourquoi est-ce? Est-ce quelque chose à propos de la conservation des commentaires? Merci

Cela n'a rien à voir avec les commentaires. Il le fait de cette façon seulement quand vous le dites "inclure SI PAS EXISTE". La raison en est qu'il ne peut inclure ou exclure par programmation que des objects s'ils sont exécutés dynamicment.

Vous pouvez désactiver cette procédure stockée en sélectionnant "False" dans Options \ Explorateur d'objects SQL Server \ Scripting – Rechercher l'existence de l'object.

Je me rends count que c'est vieux, mais le correctif est enterré assez profondément dans Sql 2012. Michael Haren a raison, la méthode de rendu des changements de sprocs lorsque les vérifications d'existence d'object sont requirejses dans les options. Pour modifier cela, allez dans Options, Explorateur d'objects server Sql, Script, Options de script d'object, et définissez 'Vérifier l'existence de l'object' sur false. Les sprocs rendent maintenant 'normalement', sans utiliser sp_executesql.

sql server 2012, set devises => Options => Objet SQL Server Explorer => Script, vérifier l'existence de l'object = false

peut résoudre ce problème.

Je suppose que cela a à voir avec la possibilité de créer plusieurs sprocs dans le même file de script sans GO? Si vous créez un sproc … directement, vous devez le compléter dans un lot (terminer avec un GO). Avec le sp_executesql, vous ne devriez pas avoir à aller dans les scripts générés entre les objects. Bien que je ne m'en souvienne pas, peut-être qu'il y en a un de toute façon .. (ne pas avoir un db devant moi).

L'utilisation de spexecutesql est une meilleure pratique. Il s'agit de prévenir l'injection SQL, etc. en isolant / limitant la scope des variables, etc. Plus ici: http://msdn.microsoft.com/fr-fr/library/ms188001.aspx

Vous n'avez pas besoin d'utiliser spexecutesql – EXEC fonctionne aussi – beaucoup de gens utilisent simplement l'ancienne EXEC – ce n'est pas aussi sûr.