2009-06-25 6 views
-1

Nous avons un SP dans lequel nous construisons une requête et ensuite exécuter la requête en utilisant l'appel exec(@select), où la variable qui contient la requête SQL comme il est construit est @select.Étrange erreur "nom de colonne invalide" lors de l'exécution SP

Une demande d'ajout d'une nouvelle colonne au jeu de résultats renvoyé par le fournisseur de services m'a été affectée. Cette nouvelle colonne ne doit pas être retournée dans toutes les circonstances, mais seulement dans certaines conditions. Naturellement, j'ai ajouté le code suivant au SP.

IF @conditionIsMet 
BEGIN 
set @select = @select + ", 'compQty' = convert(varchar(53), di.qty) " 
END 

Cela a bien fonctionné jusqu'à aujourd'hui, quand mon application ne cesse de lancer une exception SQL avec le message, "nom de colonne non valide: compQty". C'est erratique et l'exception n'est pas toujours lancée. L'exécution du SP dans SQL Server Management Studio ne génère aucune erreur.

La colonne est rendue avec l'en-tête 'compQty'. Donc, l'application devrait ramasser la colonne, mais il ne semble pas !!

Quelqu'un peut-il vous aider?

+0

log la valeur de @ Sélectionnez, comparez le "cela a fonctionné" au "il a échoué" et voyez s'il y a un modèle –

+0

@KM, quand il échoue, je cours le SP dans le studio de gestion et je peux voir la colonne compQty. Il semble que resultSet.getString ("compQty") ne voit pas la colonne compQty. –

+0

Avez-vous essayé de spécifier complètement la colonne, c'est-à-dire le nom de table.compQty? En outre, au lieu d'utiliser des guillemets, il est préférable d'utiliser des crochets, c'est-à-dire [nom_table]. [CompQty]. –

Répondre

1

Ne pas entourer le nom de colonne entre guillemets simples 'compQty '

+0

@Mitch, j'ai essayé cela, et cela a fonctionné pendant un certain temps, mais le problème est de retour. :-(De plus, il y a d'autres champs avant cela, qui ont des guillemets simples.Il ne semble pas y avoir de problème avec ceux-là. –

0

Il me semble que quoted identifiers est la question ici.

Il semble qu'un paramètre a été modifié dans votre environnement pour les identificateurs entre guillemets et que cela a provoqué l'exception. Utilisez ceci au début de votre requête:

Set Quoted_Identifier OFF; Editer: Vous êtes parfois confronté au problème et parfois non parce que votre condition IF n'est pas toujours remplie.

+0

@Tapori, nous avons activé ANSI_NULLS ON et désactivé QUOTED_IDENTIFIER au début de notre SP. –

+0

@Tapori, notre flux est que le SP sera exécuté deux fois - la première fois, la condition n'est pas remplie, et la deuxième fois, la condition est remplie. Donc, si cela échoue à cause de l'IF, il devrait échouer à chaque fois. Mais pas ici - il a échoué la première fois, puis j'ai supprimé les guillemets autour du nom de la colonne comme @Mitch suggéré, et cela a fonctionné, et maintenant échoue à nouveau. –

1

lié au problème quoted identifier que @Tapori identifié: si le proc stocké ressemble:

CREATE PROCEDURE [dbo].[usp_Something] 
AS 
    SET QUOTED_IDENTIFIER OFF 

    DECLARE @select NVARCHAR(200) 

    SET @select = 'SELECT * FROM table WHERE ''col1'' = 42' 
GO 

Ensuite, vous aurez un problème. Le problème est que le paramètre de QUOTED_IDENTIFIER n'a pas d'importance lorsque le proc stocké est exécuté, il est important lorsque le proc stocké est créé. Donc, vous avez réellement besoin de faire:

SET QUOTED_IDENTIFIER OFF 
GO 
CREATE PROCEDURE [dbo].[usp_Something] 
AS 
    DECLARE @select NVARCHAR(200) 

    SET @select = 'SELECT * FROM table WHERE ''col1'' = 42' 
GO 

Et voir ce que cela fait.

0

Si vous avez la même table dans plus d'un schéma que vous pouvez faire face à la

nom de colonne non valide

Solution: définition explicite du schéma: [schemaName].[tableName]

Questions connexes