J'obtiens l'erreur lors de l'accès à une procédure stockée dans SQL Server
Server Error in '/' Application.
Procedure or function 'ColumnSeek' expects parameter '@template', which was not supplied.
Cela se produit lorsque j'appelle une procédure stockée avec un paramètre via la connexion de données de .net à sql (System.data.SqlClient)
, même si je fournis le paramètre. Voici mon code.
SqlConnection sqlConn = new SqlConnection(connPath);
sqlConn.Open();
//METADATA RETRIEVAL
string sqlCommString = "QCApp.dbo.ColumnSeek";
SqlCommand metaDataComm = new SqlCommand(sqlCommString, sqlConn);
metaDataComm.CommandType = CommandType.StoredProcedure;
SqlParameter sp = metaDataComm.Parameters.Add("@template",SqlDbType.VarChar,50);
sp.Value = Template;
SqlDataReader metadr = metaDataComm.ExecuteReader();
Et ma procédure stockée est:
USE [QCApp]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[ColumnSeek]
@template varchar(50)
AS
EXEC('SELECT Column_Name, Data_Type
FROM [QCApp].[INFORMATION_SCHEMA].[COLUMNS]
WHERE TABLE_NAME = ' + @template);
J'essaie de comprendre ce que je fais de mal ici.
Edit: En fin de compte, le modèle était nul car j'obtenais sa valeur à partir d'un paramètre passé via l'URL et j'ai foiré le paramètre d'url en passant (j'utilisais @
pour et au lieu de &
)
.net
sql-server
stored-procedures
Tony Peterson
la source
la source
QUOTENAME(@template)
Réponses:
Je vérifierais le code de mon application et verrais à quelle valeur vous définissez @template. Je soupçonne qu'il est nul et c'est là que réside le problème.
la source
En plus des autres réponses ici, si vous avez oublié de mettre:
Ensuite, vous obtiendrez également cette erreur.
la source
Ce problème est en effet généralement causé par la définition d'une valeur de paramètre sur null comme HLGEM mentionné ci-dessus. J'ai pensé développer quelques solutions à ce problème que j'ai trouvées utiles pour le bénéfice des personnes qui ne connaissent pas ce problème.
La solution que je préfère est de définir par défaut les paramètres de la procédure stockée sur NULL (ou quelle que soit la valeur souhaitée), ce qui a été mentionné par sangram ci-dessus, mais peut être manquée car la réponse est très verbeuse. Quelque chose du genre:
Cela signifie que si le paramètre finit par être défini dans le code sur null dans certaines conditions, .NET ne définira pas le paramètre et la procédure stockée utilisera alors la valeur par défaut qu'elle a définie. Une autre solution, si vous voulez vraiment résoudre le problème dans le code, serait d'utiliser une méthode d'extension qui gère le problème pour vous, quelque chose comme:
Matt Hamilton a un bon article ici qui répertorie d'autres méthodes d'extension intéressantes dans ce domaine.
la source
J'ai eu un problème où j'obtenais l'erreur lorsque j'ai fourni 0 à un paramètre entier. Et j'ai trouvé que:
fonctionne, mais cela ne fonctionne pas:
la source
Add
syntaxe, ou si vous utilisiez un initialiseur d'objet pour votre commande, vous pouvez utiliser un paramètre nommé:cmd.Parameters.Add(new SqlParameter("@Status", value: 0));
Dans mon cas, j'ai dû passer
DBNULL.Value
(en utilisant la condition if else) du code pour les paramètres de procédures stockées qui ne sont pas définisnull
mais que la valeur l'estnull
.la source
Je rencontre un problème similaire en appelant une procédure stockée
Ce qui construit dynamiquement la requête de recherche que j'appelais ci-dessus par:
Ensuite, après beaucoup de grattage, j'ai modifié la procédure stockée pour:
ICI J'initialise les paramètres d'entrée de la procédure stockée à null comme suit
cela a fait l'affaire pour moi.
J'espère que cela sera utile à quelqu'un qui tombe dans le même piège.
la source
Si le modèle n'est pas défini (c'est-à-dire == null), cette erreur sera également déclenchée.
Plus de commentaires:
Si vous connaissez la valeur du paramètre au moment où vous ajoutez des paramètres, vous pouvez également utiliser AddWithValue
L'EXEC n'est pas requis. Vous pouvez référencer directement le paramètre @template dans SELECT.
la source
Premièrement, pourquoi est-ce un EXEC? Cela ne devrait-il pas être juste
Le SP actuel n'a pas de sens? En particulier, cela rechercherait une colonne correspondant à @template, pas à la valeur varchar de @template. c'est-à-dire que si @template est
'Column_Name'
, il rechercheraitWHERE TABLE_NAME = Column_Name
, ce qui est très rare (avoir une table et une colonne nommées de la même manière).En outre, si vous ne devez utiliser SQL dynamique, vous devez utiliser
EXEC sp_ExecuteSQL
( en gardant les valeurs en tant que paramètres) pour empêcher des attaques d'injection (plutôt que concaténation de l' entrée). Mais ce n'est pas nécessaire dans ce cas.Re le problème réel - il semble correct d'un coup d'œil; êtes-vous sûr de ne pas avoir une copie différente du SP? C'est une erreur courante ...
la source
Je suis tombé sur cette erreur aujourd'hui lorsque des valeurs nulles ont été transmises aux paramètres de ma procédure stockée. J'ai pu facilement corriger en modifiant la procédure stockée en ajoutant la valeur par défaut = null.
la source
J'ai eu le même problème, pour le résoudre, ajoutez exactement le même nom de paramètre à votre collection de paramètres que dans vos procédures stockées.
Exemple
Disons que vous créez une procédure stockée:
Assurez-vous donc de nommer votre paramètre exactement tel qu'il est dans votre procédure stockée, ce serait
si vous allez
alors l'erreur se produit.
la source
Il est nécessaire de dire qu'un processus stocké est appelé:
la source