Я получаю сообщение об ошибке при доступе к хранимой процедуре в SQL Server
Server Error in '/' Application.
Procedure or function 'ColumnSeek' expects parameter '@template', which was not supplied.
Это происходит, когда я вызываю хранимую процедуру с параметром через подключение данных .net к sql (System.data.SqlClient)
, даже если я предоставляю параметр. Вот мой код.
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();
И моя хранимая процедура:
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);
Я пытаюсь понять, что я здесь делаю не так.
Изменить: как оказалось, шаблон был нулевым, потому что я получал его значение из параметра, переданного через URL-адрес, и я испортил передачу параметра URL-адреса (я использовал @
для и вместо &
)
.net
sql-server
stored-procedures
Тони Петерсон
источник
источник
QUOTENAME(@template)
Ответы:
Я бы проверил код своего приложения и посмотрел, какое значение вы устанавливаете для @template. Я подозреваю, что это ноль, и в этом проблема.
источник
В дополнение к другим ответам здесь, если вы забыли указать:
Тогда вы также получите эту ошибку.
источник
Эта проблема действительно обычно возникает из-за установки значения параметра равным null, как указано выше в HLGEM . Я подумал, что смогу более подробно рассказать о некоторых решениях этой проблемы, которые я нашел полезными для людей, плохо знакомых с этой проблемой.
Решение, которое я предпочитаю, - установить по умолчанию для параметров хранимой процедуры значение NULL (или любое другое значение, которое вы хотите), что было упомянуто выше в sangram , но может быть пропущено, потому что ответ очень подробный. Что-то вроде:
Это означает, что если параметр в конечном итоге устанавливается в коде на null при некоторых условиях, .NET не будет устанавливать параметр, и хранимая процедура будет использовать значение по умолчанию, которое она определила. Другое решение, если вы действительно хотите решить проблему в коде, - это использовать метод расширения, который решает проблему за вас, например:
Matt Hamilton имеет хороший пост здесь , что списки еще некоторые большие методы расширения при работе с этой областью.
источник
У меня была проблема, когда я получал ошибку, когда я указывал 0 для целочисленного параметра. И обнаружил, что:
работает, но это не так:
источник
Add
синтаксис или использовали инициализатор объекта для своей команды, вы можете использовать именованный параметр:cmd.Parameters.Add(new SqlParameter("@Status", value: 0));
В моем случае мне пришлось передать
DBNULL.Value
(используя условие if else) из кода для параметра хранимых процедур, который не определен,null
но есть значениеnull
.источник
Я столкнулся с аналогичной проблемой при вызове хранимой процедуры
Который динамически строил запрос для поиска, который я вызывал выше:
Затем, после долгой царапины в голове, я изменил хранимую процедуру на:
ЗДЕСЬ я инициализирую входные параметры хранимой процедуры до нуля, как следует
Это помогло Мне.
Я надеюсь, что это будет полезно тем, кто попадется в подобную ловушку.
источник
Если шаблон не установлен (т.е. == null), эта ошибка также будет вызвана.
Больше комментариев:
Если вы знаете значение параметра к моменту добавления параметров, вы также можете использовать AddWithValue
EXEC не требуется. Вы можете напрямую ссылаться на параметр @template в SELECT.
источник
Во-первых, почему это EXEC? Разве это не должно быть просто
Текущий SP не имеет смысла? В частности, это будет искать столбец, соответствующий @template, а не значение varchar @template. т.е. если есть @template
'Column_Name'
, он будет искатьWHERE TABLE_NAME = Column_Name
, что очень редко (чтобы таблица и столбец назывались одинаково).Кроме того, если вам действительно нужно использовать динамический SQL, вы должны использовать
EXEC sp_ExecuteSQL
(сохраняя значения в качестве параметров), чтобы предотвратить атаки инъекций (а не конкатенацию ввода). Но в данном случае это не обязательно.Повторите реальную проблему - на первый взгляд все нормально; вы уверены, что у вас нет другой копии SP? Это частая ошибка ...
источник
Я столкнулся с этой ошибкой сегодня, когда в параметры моей хранимой процедуры были переданы нулевые значения. Мне удалось легко исправить, изменив хранимую процедуру, добавив значение по умолчанию = null.
источник
У меня была такая же проблема, чтобы решить ее, просто добавьте точно такое же имя параметра в свою коллекцию параметров, что и в ваших хранимых процедурах.
пример
Допустим, вы создали хранимую процедуру:
Поэтому обязательно назовите свой параметр точно так же, как в вашей хранимой процедуре, это будет
если вы идете
тогда происходит ошибка.
источник
Необходимо сказать, что вызывается Stored Proc:
источник