Beim Zugriff auf eine gespeicherte Prozedur in SQL Server wird der Fehler angezeigt
Server Error in '/' Application.
Procedure or function 'ColumnSeek' expects parameter '@template', which was not supplied.
Dies geschieht, wenn ich eine gespeicherte Prozedur mit einem Parameter über die Datenverbindung von .net zu SQL aufrufe (System.data.SqlClient)
, obwohl ich den Parameter bereitstelle . Hier ist mein 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();
Und meine gespeicherte Prozedur ist:
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);
Ich versuche herauszufinden, was ich hier falsch mache.
Bearbeiten: Wie sich herausstellte, war Template null, weil ich seinen Wert von einem Parameter erhalten habe, der über die URL übergeben wurde, und die URL-Parameterübergabe vermasselt habe (ich habe @
für und anstelle von verwendet &
).
.net
sql-server
stored-procedures
Tony Peterson
quelle
quelle
QUOTENAME(@template)
Antworten:
Ich würde meinen Anwendungscode überprüfen und sehen, auf welchen Wert Sie @template setzen. Ich vermute, es ist null und darin liegt das Problem.
quelle
Zusätzlich zu den anderen Antworten hier, wenn Sie vergessen haben zu setzen:
Dann erhalten Sie auch diesen Fehler.
quelle
Dieses Problem wird in der Tat normalerweise dadurch verursacht, dass ein Parameterwert wie oben erwähnt auf Null gesetzt wird. Ich dachte, ich würde einige Lösungen für dieses Problem erarbeiten, die ich zum Nutzen von Menschen, die neu in diesem Problem sind, als nützlich empfunden habe.
Die Lösung, die ich bevorzuge, besteht darin, die Parameter der gespeicherten Prozedur standardmäßig auf NULL (oder einen beliebigen Wert) zu setzen, was oben von Sangram erwähnt wurde , aber möglicherweise übersehen wird, weil die Antwort sehr ausführlich ist. Etwas in der Art von:
Dies bedeutet, dass, wenn der Parameter unter bestimmten Bedingungen im Code auf Null gesetzt wird, .NET den Parameter nicht setzt und die gespeicherte Prozedur den von ihr definierten Standardwert verwendet. Eine andere Lösung, wenn Sie das Problem wirklich im Code lösen möchten, wäre die Verwendung einer Erweiterungsmethode, die das Problem für Sie behandelt, etwa:
Matt Hamilton hat einen guten Beitrag hier , dass die Listen einige weitere große Erweiterungsmethoden , wenn sie mit diesem Bereich zu tun.
quelle
Ich hatte ein Problem, bei dem ich den Fehler bekam, wenn ich einem ganzzahligen Parameter 0 gab. Und fand das:
funktioniert, aber das geht nicht:
quelle
Add
Syntax verwendencmd.Parameters.Add(new SqlParameter("@Status", value: 0));
Für meinen Fall musste ich
DBNULL.Value
(unter Verwendung der if else-Bedingung) Code für gespeicherte Prozedurparameter übergeben, die nicht definiert sind,null
aber der Wert istnull
.quelle
Beim Aufrufen der gespeicherten Prozedur ist ein ähnliches Problem aufgetreten
Welche dynamische Konstruktion der Suchabfrage habe ich oben aufgerufen von:
Dann habe ich nach viel Kopfkratzen die gespeicherte Prozedur geändert, um:
HIER initialisiere ich die Eingabeparameter der gespeicherten Prozedur auf Null wie folgt
Das hat den Trick für mich getan.
Ich hoffe, dass dies für jemanden hilfreich ist, der in eine ähnliche Falle gerät.
quelle
Wenn die Vorlage nicht festgelegt ist (dh == null), wird auch dieser Fehler ausgelöst.
Mehr Kommentare:
Wenn Sie den Parameterwert zum Zeitpunkt des Hinzufügens von Parametern kennen, können Sie auch AddWithValue verwenden
Die EXEC ist nicht erforderlich. Sie können den Parameter @template in SELECT direkt referenzieren.
quelle
Erstens - warum ist das eine EXEC? Sollte das nicht einfach so sein?
Der aktuelle SP macht keinen Sinn? Dies würde insbesondere nach einer Spalte suchen, die mit @template übereinstimmt, nicht nach dem varchar-Wert von @template. dh wenn @template ist
'Column_Name'
, würde es suchenWHERE TABLE_NAME = Column_Name
, was sehr selten ist (Tabelle und Spalte haben den gleichen Namen).Auch wenn Sie keine haben dynamische SQL zu verwenden, sollten Sie verwenden
EXEC sp_ExecuteSQL
(wobei die Werte als Parameter) , um von Injection - Angriffe zu verhindern ( und nicht als Verkettung von Input). In diesem Fall ist dies jedoch nicht erforderlich.Bezüglich des eigentlichen Problems - es sieht auf den ersten Blick in Ordnung aus; Sind Sie sicher, dass Sie keine andere Kopie des SP haben? Dies ist ein häufiger Fehler ...
quelle
Ich bin heute auf diesen Fehler gestoßen, als Nullwerte an die Parameter meiner gespeicherten Prozedur übergeben wurden. Ich konnte das Problem leicht beheben, indem ich die gespeicherte Prozedur durch Hinzufügen des Standardwerts = null änderte.
quelle
Ich hatte das gleiche Problem, um es zu lösen, füge deiner Parametersammlung genau den gleichen Parameternamen hinzu wie in deinen gespeicherten Prozeduren.
Beispiel
Angenommen, Sie erstellen eine gespeicherte Prozedur:
Benennen Sie Ihren Parameter also genau so, wie er sich in Ihrer gespeicherten Prozedur befindet
wenn du gehst
dann passiert der Fehler.
quelle
Es muss angegeben werden, dass ein gespeicherter Prozess aufgerufen wird:
quelle