2009-09-24 8 views
0

Je travaille avec une table de valeurs flottantes, mais j'entrer dans la colonne par le paramètreUtilisez SELECT AVG avec les paramètres "SELECT AVG (@parameter)" SQL!

SELECT AVG (@var) AS Aver DE LISTVAL

Quand j'entre le nom de la colonne (le paramètre) I recieve a error: que le type de données nvarchar n'est pas valide pour l'opérateur avg. Mais toutes les colonnes flottent.

Aidez-moi !!! s'il vous plaît

+0

Est-ce SQL Server? –

+0

en utilisant des points d'exclamation (en dehors des blocs de code) est une sorte d'impolitesse –

Répondre

4

Vous devez utiliser SQL

dynamique par exemple

EXEC('SELECT AVG([' + @var + ']) AS Aver FROM ListVal') 
2

Les paramètres de requête se substituent à une seule valeur littérale, pas à un nom de colonne. C'est un comportement SQL standard, pris en charge de la même manière dans toutes les marques de SGBDR.

Alors vous avez fourni le nom d'une colonne et il est comme si vous exécutiez cette requête:

SELECT AVG('columnname') ... 

Ce qui est une opération dénuée de sens. Quel est le AVG() d'une chaîne?

@Matt Rogish a raison dans son answer que la seule façon de rendre dynamiques les noms de colonnes (ou les noms de tables, ou toute autre syntaxe SQL) est d'utiliser le SQL dynamique. Autrement dit, interpolez les variables d'application dans une chaîne, puis utilisez la chaîne résultante en tant que requête SQL.

Vous pouvez utiliser des paramètres de requête uniquement pour injecter une seule valeur scalaire, et c'est ainsi que le paramètre sera interprété dans la requête.