Obtenez le résultat de SQL dynamique dans une procédure stockée
Je suis en train d'écrire une procédure stockée où j'ai besoin de construire dynamiquement une instruction SQL dans la procédure pour faire référence à un passé dans le nom de la table.
J'ai besoin de cette instruction SQL retour à un résultat que je peux utiliser dans le reste de la procédure.
J'ai essayé d'utiliser des tables temporaires et tout, mais je reçois un message que j'ai besoin de déclarer les variables, etc.
Par exemple:
DECLARE @FiscalYear INT
DECLARE @DataSource NVARCHAR(25)
DECLARE @SQL NVARCHAR(250)
SELECT @DataSource = 'CustomerCosts20120328'
DECLARE @tempFiscalYear TABLE ( FiscalYear INT )
SELECT @SQL = 'INSERT INTO @tempFiscalYear SELECT DISTINCT FiscalYear FROM ' + @DataSource
EXEC(@SQL)
SELECT @FiscalYear = FiscalYear FROM @tempFiscalYear
Ou...
DECLARE @FiscalYear INT
DECLARE @DataSource NVARCHAR(25)
DECLARE @SQL NVARCHAR(250)
SELECT @DataSource = 'CustomerCosts20120328'
SELECT @SQL = 'SELECT DISTINCT @FiscalYear = FiscalYear FROM ' + @DataSource
EXEC(@SQL)
Est-il de toute façon pour le faire sans recourir à l'aide d'un tableau?
Grâce.
OriginalL'auteur Tom | 2012-04-24
Vous devez vous connecter pour publier un commentaire.
Avez-vous essayez quelque chose comme:
Vous voudrez vous assurer que vous préfixe de type nvarchar chaînes avec N, par exemple
SELECT @SQL = N'SELECT ...
.Aussi, vous savez que si la requête renvoie plusieurs lignes, la valeur qui sera affectée à
@FiscalYear
est complètement arbitraire, droit? Alors que vous pouvez vous attendre à une valeur unique à partir de ce tableau, il ne peut pas nuire à l'utilisationMAX()
ouTOP 1 ... ORDER BY
pour s'assurer que seulement un seul, la valeur prévisible est jamais affecté.C'est exactement ce qu'il fait - il met la valeur obtenue dans le SQL dynamique dans une variable à l'extérieur de la portée. Ajouter
PRINT @FiscalYear;
la ligne suivante pour confirmer. Essayez de code au lieu de le remettre en question. 🙂Désolé, je n'ai pour l'essayer. A un rouge SÉLECTIONNEZ là qui m'a jeté pour une minute. Elle fonctionne.
OriginalL'auteur Aaron Bertrand
Tout d'abord, vous devez savoir qu'avec le SQL dynamique, vous risquez une attaque par injection SQL, et vous devez d'abord prendre un coup d'oeil à ce lien avant de l'utiliser. Après vous faites cela, vous pouvez modifier votre première requête pour:
Vous devez également prendre en compte @AaronBertrand commentaire sur la cession de la
@FiscalYear
paramètre.Merci, je n'ai pas à vous soucier de l'injection SQL avec cette procédure stockée, mais gardera que l'article à portée de main pour référence ultérieure.
Ouais, peut-être que je suis juste exagérer à ce sujet...c'est la force de l'habitude.
OriginalL'auteur Lamak