Recibo el error al acceder a un procedimiento almacenado en SQL Server
Server Error in '/' Application.
Procedure or function 'ColumnSeek' expects parameter '@template', which was not supplied.
Esto sucede cuando llamo a un procedimiento almacenado con un parámetro a través de la conexión de datos de .net a sql (System.data.SqlClient)
, aunque estoy proporcionando el parámetro. Aquí está mi código.
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();
Y mi procedimiento almacenado es:
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);
Estoy tratando de averiguar qué estoy haciendo mal aquí.
Editar: Como resultado, la plantilla era nula porque obtenía su valor de un parámetro pasado a través de la URL y arruiné el paso del parámetro de URL (estaba usando @
para y en lugar de &
)
.net
sql-server
stored-procedures
Tony Peterson
fuente
fuente
QUOTENAME(@template)
Respuestas:
Verificaría el código de mi aplicación y vería en qué valor está configurando @template. Sospecho que es nulo y ahí radica el problema.
fuente
Además de las otras respuestas aquí, si olvidó poner:
Entonces también obtendrá este error.
fuente
De hecho, este problema generalmente se debe al establecer un valor de parámetro en nulo como HLGEM mencionado anteriormente. Pensé en desarrollar algunas soluciones a este problema que he encontrado útiles para el beneficio de personas nuevas en este problema.
La solución que prefiero es establecer de forma predeterminada los parámetros del procedimiento almacenado en NULL (o el valor que desee), que fue mencionado por sangram anteriormente, pero que se puede perder porque la respuesta es muy detallada. Algo parecido a:
Esto significa que si el parámetro termina estableciéndose en código como nulo bajo algunas condiciones, .NET no establecerá el parámetro y el procedimiento almacenado usará el valor predeterminado que ha definido. Otra solución, si realmente desea resolver el problema en código, sería usar un método de extensión que maneje el problema por usted, algo como:
Matt Hamilton tiene una buena publicación aquí que enumera algunos métodos de extensión más geniales cuando se trata de esta área.
fuente
Tuve un problema en el que obtendría el error cuando proporcioné 0 a un parámetro entero. Y encontré que:
funciona, pero esto no:
fuente
Add
sintaxis, o si estaba usando un inicializador de objeto para su comando, podría usar un parámetro con nombre:cmd.Parameters.Add(new SqlParameter("@Status", value: 0));
Para mi caso, tuve que pasar
DBNULL.Value
(usando la condición if else) del código para el parámetro de procedimientos almacenados que no están definidosnull
pero el valor sínull
.fuente
Me encuentro con un problema similar al llamar al procedimiento almacenado
Que construyendo dinámicamente la consulta para la búsqueda que estaba llamando arriba uno por:
Luego, después de rascarme mucho la cabeza, modifiqué el procedimiento almacenado para:
AQUÍ estoy inicializando los parámetros de entrada del procedimiento almacenado a nulo de la siguiente manera
eso me sirvió.
Espero que esto sea útil para alguien que caiga en una trampa similar.
fuente
Si Plantilla no está configurada (es decir, == nula), este error también se generará.
Más comentarios:
Si conoce el valor del parámetro en el momento en que agrega parámetros, también puede usar AddWithValue
No se requiere EXEC. Puede hacer referencia al parámetro @template en SELECT directamente.
fuente
Primero, ¿por qué es un EXEC? ¿No debería ser eso?
¿El SP actual no tiene sentido? En particular, eso buscaría una columna que coincida con @template, no el valor varchar de @template. es decir, si @template lo es
'Column_Name'
, buscaríaWHERE TABLE_NAME = Column_Name
, lo cual es muy raro (tener tabla y columna con el mismo nombre).Además, si usted no tiene que utilizar SQL dinámico, se debe utilizar
EXEC sp_ExecuteSQL
(manteniendo los valores como parámetros) para evitar los ataques de inyección (en lugar de concatenación de entrada). Pero no es necesario en este caso.Con respecto al problema real, se ve bien de un vistazo; ¿Estás seguro de que no tienes una copia diferente del SP? Es un error común...
fuente
Me encontré con este error hoy cuando se pasaron valores nulos a los parámetros de mi procedimiento almacenado. Pude arreglar fácilmente modificando el procedimiento almacenado agregando valor predeterminado = nulo.
fuente
Tuve el mismo problema, para resolverlo simplemente agregue exactamente el mismo nombre de parámetro a su colección de parámetros que en sus procedimientos almacenados.
Ejemplo
Digamos que crea un procedimiento almacenado:
Así que asegúrese de nombrar su parámetro exactamente como está en su procedimiento almacenado, esto sería
si vas
entonces ocurre el error.
fuente
Es necesario indicar que se está llamando a un proceso almacenado:
fuente