Estou recebendo o erro ao acessar um procedimento armazenado no SQL Server
Server Error in '/' Application.
Procedure or function 'ColumnSeek' expects parameter '@template', which was not supplied.
Isso está acontecendo quando eu chamo uma Stored Procedure com um parâmetro por meio da conexão de dados .net para sql (System.data.SqlClient)
, embora eu esteja fornecendo o parâmetro. Aqui está meu 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();
E meu procedimento armazenado é:
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);
Estou tentando descobrir o que estou fazendo de errado aqui.
Edit: Acontece que o template era nulo porque eu estava obtendo seu valor de um parâmetro passado pelo URL e eu estraguei a passagem do parâmetro url (eu estava usando @
para e em vez de &
)
.net
sql-server
stored-procedures
Tony Peterson
fonte
fonte
QUOTENAME(@template)
Respostas:
Gostaria de verificar o código do meu aplicativo e ver qual valor você está definindo como @template. Suspeito que seja nulo e aí está o problema.
fonte
Além das outras respostas aqui, se você se esqueceu de colocar:
Em seguida, você também receberá esse erro.
fonte
Esse problema é geralmente causado pela definição de um valor de parâmetro como nulo, conforme HLGEM mencionado acima. Pensei em elaborar algumas soluções para este problema que achei úteis para o benefício de pessoas novas neste problema.
A solução que eu prefiro é padronizar os parâmetros do procedimento armazenado para NULL (ou qualquer valor que você quiser), o que foi mencionado por sangram acima, mas pode ser perdido porque a resposta é muito prolixa. Algo na linha de:
Isso significa que se o parâmetro acabar sendo definido no código como nulo em algumas condições, o .NET não definirá o parâmetro e o procedimento armazenado usará o valor padrão definido. Outra solução, se você realmente deseja resolver o problema no código, seria usar um método de extensão que lida com o problema para você, algo como:
Matt Hamilton tem uma boa postagem aqui que lista mais alguns métodos de extensão excelentes para lidar com essa área.
fonte
Tive um problema em que recebia o erro quando fornecia 0 para um parâmetro inteiro. E descobri que:
funciona, mas isso não:
fonte
Add
sintaxe ou se estiver usando um inicializador de objeto para o seu comando, poderá usar um parâmetro nomeado:cmd.Parameters.Add(new SqlParameter("@Status", value: 0));
No meu caso, tive que passar
DBNULL.Value
(usando a condição if else) do código para o parâmetro de procedimentos armazenados que não estão definidos,null
mas o valor estánull
.fonte
Encontro um problema semelhante ao chamar um procedimento armazenado
Que construindo dinamicamente a consulta para pesquisa que eu estava chamando acima de uma por:
Então, depois de muito coçar a cabeça, modifiquei o procedimento armazenado para:
AQUI estou inicializando os parâmetros de entrada do procedimento armazenado para nulo conforme segue
isso funcionou para mim.
Espero que isso seja útil para alguém que caiu na armadilha semelhante.
fonte
Se o modelo não estiver definido (ou seja, == nulo), esse erro também será gerado.
Mais comentários:
Se você souber o valor do parâmetro no momento em que adiciona parâmetros, também pode usar AddWithValue
O EXEC não é necessário. Você pode fazer referência ao parâmetro @template diretamente no SELECT.
fonte
Primeiro - por que isso é um EXEC? Isso não deveria ser apenas
O atual SP não faz sentido? Em particular, isso procuraria por uma coluna correspondente a @template, não o valor varchar de @template. ou seja, se @template for
'Column_Name'
, ele pesquisaráWHERE TABLE_NAME = Column_Name
, o que é muito raro (ter tabela e coluna com o mesmo nome).Além disso, se você não tem que usar SQL dinâmico, você deve usar
EXEC sp_ExecuteSQL
(mantendo os valores como parâmetros) para impedir ataques de injeção (em vez de concatenação de entrada). Mas não é necessário neste caso.Re o problema real - parece OK à primeira vista; tem certeza de que não tem uma cópia diferente do SP por aí? Este é um erro comum ...
fonte
Encontrei este erro hoje, quando valores nulos foram passados para os parâmetros do meu procedimento armazenado. Consegui corrigir facilmente alterando o procedimento armazenado adicionando valor padrão = nulo.
fonte
Eu tive o mesmo problema, para resolvê-lo, basta adicionar exatamente o mesmo nome de parâmetro em sua coleção de parâmetros como em seus procedimentos armazenados.
Exemplo
Digamos que você crie um procedimento armazenado:
Portanto, certifique-se de nomear seu parâmetro exatamente como está em seu procedimento armazenado.
se tu vais
então o erro acontece.
fonte
É necessário informar que um Stored Proc está sendo chamado:
fonte