2009-02-20 7 views
1

il est très facile à utiliser l'instruction SQL suivante pour obtenir la valeur pour une clé primaire spécifique: ID d'une table spécifique: Mytale:SQL générique pour obtenir la valeur maximale tableau données et les noms de colonnes comme varchar

DECLARE @v_maxID bigint; 
SELECT @v_maxID = MAX(ID) FROM myTable; 

Qu'est-ce que J'ai besoin est un code SQL générique pour obtenir la valeur maximale pour une clé d'une table, où la clé et le tableau sont spécifiés varchar types (max) en tant que paramètres:

DECLARE @v_maxID bigint; 
-- SELECT @v_maxID = MAX(@p_ID) FROM @p_Table; 

Je commente le SELECT car il est ne fonctionne pas. J'ai essayé de construire une chaîne SQL et je peux l'EXEC, mais je ne peux pas récupérer la valeur max à ma variable locale (@v_maxID). Aucune suggestion?

Répondre

0

-moi si je me trompe, mais ne vous voulez tout simplement pas:

SELECT MAX (ID) FROM mytable

0

Construire la requête au niveau de l'application, donc le fonctionnement de la requête serait juste comme celui ci-dessus. Faire sur sql va certainement vous ouvrir pour l'injection sql, puisque vous devez utiliser exec(). Dans tous les cas, faites attention à la saisie par l'utilisateur.

+0

Notez que la réponse de BC souffre la même chose que exec, c'est sql injectable. Si vous contrôlez l'entrée, allez-y. – eglasius

+0

On peut espérer que les noms de tables et de colonnes ne sont pas des entrées utilisateur, mais vous avez raison concernant la sécurité des paramètres. –

+0

oui, ceci est juste une petite section de codes dont j'ai besoin dans mon plus grand SP et celui-ci sera exécuté par un travail régulier tous les jours. J'ai le contrôle total du SP pour un usage interne. –

5
DECLARE @max bigint, @sql nvarchar(max) 
SET @sql = N'SELECT @max = MAX(' + @p_ID + ') FROM ' + @p_Table 

EXEC sp_executesql 
    @query = @sql, 
    @params = N'@max bigint OUTPUT', 
    @max = @max OUTPUT 

PRINT @max 
5

Les utilisateurs sont choosers, mais je considère que cette idée laid (pour être surgénéralisé). Et non -optimisable. Il suffit d'écrire le SQL.

+0

Amen +1 mais j'obtiens un cookie pour la réponse techniquement correcte. –

+0

Je seconde l'Amen. ;-) +1 – Tomalak

+0

J'ai soulevé cette question car j'avais besoin de ce code dans un SP plus grand, pas seulement un SP pour ce travail. –

Questions connexes