프로시저에서 제공되지 않은 매개 변수를 예상합니다.
SQL Server에서 저장 프로시저에 액세스할 때 오류가 발생함
Server Error in '/' Application.
Procedure or function 'ColumnSeek' expects parameter '@template', which was not supplied.
를 .net의통해 했을 때 합니다.(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 파라미터 전달을 망쳤기 때문입니다(사용하고 있었습니다).@
「」이 아닌 「」의 , 「」의 경우.&
)
여기에 기재되어 있는 다른 답변 외에, 다음과 같은 것을 잊어버린 경우:
cmd.CommandType = CommandType.StoredProcedure;
그러면 이 에러도 표시됩니다.
어플리케이션 코드를 체크하고 @template의 값을 확인합니다.나는 그것이 무효라고 의심하고 거기에 문제가 있다.
실제로 이 문제는 위에서 설명한 바와 같이 파라미터 값을 null로 설정함으로써 발생합니다.나는 이 문제에 대해 내가 이 문제에 대해 처음 접하는 사람들의 이익을 위해 유용하다고 생각하는 몇 가지 해결책에 대해 자세히 설명하려고 했다.
제가 선호하는 솔루션은 저장 프로시저 파라미터를 NULL(또는 원하는 값)로 디폴트하는 것입니다.이러한 값은 위의 sangram에서 언급했지만 답변이 매우 상세하기 때문에 놓칠 수 있습니다.다음과 같은 것들이 있습니다.
CREATE PROCEDURE GetEmployeeDetails
@DateOfBirth DATETIME = NULL,
@Surname VARCHAR(20),
@GenderCode INT = NULL,
AS
즉, 어떤 조건에서는 파라미터가 코드로 null로 설정될 경우 입니다.NET은 파라미터를 설정하지 않고 스토어드 프로시저는 정의한 기본값을 사용합니다.코드로 문제를 해결하려면 다음과 같은 확장 방법을 사용합니다.
public static SqlParameter AddParameter<T>(this SqlParameterCollection parameters, string parameterName, T value) where T : class
{
return value == null ? parameters.AddWithValue(parameterName, DBNull.Value) : parameters.AddWithValue(parameterName, value);
}
Matt Hamilton은 이 분야를 다룰 때 더 좋은 확장 방법을 나열하는 좋은 게시물을 가지고 있습니다.
정수 파라미터에 0을 지정하면 에러가 발생하는 문제가 있었습니다.그리고 다음과 같은 것을 알 수 있었습니다.
cmd.Parameters.AddWithValue("@Status", 0);
동작하지만, 이것은 동작하지 않습니다.
cmd.Parameters.Add(new SqlParameter("@Status", 0));
합격하지 안 됐어요.DBNULL.Value
에서 (조건을 사용하는 null
, 값은 '''입니다.null
.
스토어드 프로시저를 호출하는 동안 유사한 문제가 발생함
CREATE PROCEDURE UserPreference_Search
@UserPreferencesId int,
@SpecialOfferMails char(1),
@NewsLetters char(1),
@UserLoginId int,
@Currency varchar(50)
AS
DECLARE @QueryString nvarchar(4000)
SET @QueryString = 'SELECT UserPreferencesId,SpecialOfferMails,NewsLetters,UserLoginId,Currency FROM UserPreference'
IF(@UserPreferencesId IS NOT NULL)
BEGIN
SET @QueryString = @QueryString + ' WHERE UserPreferencesId = @DummyUserPreferencesId';
END
IF(@SpecialOfferMails IS NOT NULL)
BEGIN
SET @QueryString = @QueryString + ' WHERE SpecialOfferMails = @DummySpecialOfferMails';
END
IF(@NewsLetters IS NOT NULL)
BEGIN
SET @QueryString = @QueryString + ' WHERE NewsLetters = @DummyNewsLetters';
END
IF(@UserLoginId IS NOT NULL)
BEGIN
SET @QueryString = @QueryString + ' WHERE UserLoginId = @DummyUserLoginId';
END
IF(@Currency IS NOT NULL)
BEGIN
SET @QueryString = @QueryString + ' WHERE Currency = @DummyCurrency';
END
EXECUTE SP_EXECUTESQL @QueryString
,N'@DummyUserPreferencesId int, @DummySpecialOfferMails char(1), @DummyNewsLetters char(1), @DummyUserLoginId int, @DummyCurrency varchar(50)'
,@DummyUserPreferencesId=@UserPreferencesId
,@DummySpecialOfferMails=@SpecialOfferMails
,@DummyNewsLetters=@NewsLetters
,@DummyUserLoginId=@UserLoginId
,@DummyCurrency=@Currency;
위에서 호출한 검색을 위한 쿼리를 동적으로 구성합니다.
public DataSet Search(int? AccessRightId, int? RoleId, int? ModuleId, char? CanAdd, char? CanEdit, char? CanDelete, DateTime? CreatedDatetime, DateTime? LastAccessDatetime, char? Deleted)
{
dbManager.ConnectionString = ConfigurationManager.ConnectionStrings["MSSQL"].ToString();
DataSet ds = new DataSet();
try
{
dbManager.Open();
dbManager.CreateParameters(9);
dbManager.AddParameters(0, "@AccessRightId", AccessRightId, ParameterDirection.Input);
dbManager.AddParameters(1, "@RoleId", RoleId, ParameterDirection.Input);
dbManager.AddParameters(2, "@ModuleId", ModuleId, ParameterDirection.Input);
dbManager.AddParameters(3, "@CanAdd", CanAdd, ParameterDirection.Input);
dbManager.AddParameters(4, "@CanEdit", CanEdit, ParameterDirection.Input);
dbManager.AddParameters(5, "@CanDelete", CanDelete, ParameterDirection.Input);
dbManager.AddParameters(6, "@CreatedDatetime", CreatedDatetime, ParameterDirection.Input);
dbManager.AddParameters(7, "@LastAccessDatetime", LastAccessDatetime, ParameterDirection.Input);
dbManager.AddParameters(8, "@Deleted", Deleted, ParameterDirection.Input);
ds = dbManager.ExecuteDataSet(CommandType.StoredProcedure, "AccessRight_Search");
return ds;
}
catch (Exception ex)
{
}
finally
{
dbManager.Dispose();
}
return ds;
}
그런 다음 머리를 많이 긁힌 후 저장 프로시저를 다음과 같이 수정했습니다.
ALTER PROCEDURE [dbo].[AccessRight_Search]
@AccessRightId int=null,
@RoleId int=null,
@ModuleId int=null,
@CanAdd char(1)=null,
@CanEdit char(1)=null,
@CanDelete char(1)=null,
@CreatedDatetime datetime=null,
@LastAccessDatetime datetime=null,
@Deleted char(1)=null
AS
DECLARE @QueryString nvarchar(4000)
DECLARE @HasWhere bit
SET @HasWhere=0
SET @QueryString = 'SELECT a.AccessRightId, a.RoleId,a.ModuleId, a.CanAdd, a.CanEdit, a.CanDelete, a.CreatedDatetime, a.LastAccessDatetime, a.Deleted, b.RoleName, c.ModuleName FROM AccessRight a, Role b, Module c WHERE a.RoleId = b.RoleId AND a.ModuleId = c.ModuleId'
SET @HasWhere=1;
IF(@AccessRightId IS NOT NULL)
BEGIN
IF(@HasWhere=0)
BEGIN
SET @QueryString = @QueryString + ' WHERE a.AccessRightId = @DummyAccessRightId';
SET @HasWhere=1;
END
ELSE SET @QueryString = @QueryString + ' AND a.AccessRightId = @DummyAccessRightId';
END
IF(@RoleId IS NOT NULL)
BEGIN
IF(@HasWhere=0)
BEGIN
SET @QueryString = @QueryString + ' WHERE a.RoleId = @DummyRoleId';
SET @HasWhere=1;
END
ELSE SET @QueryString = @QueryString + ' AND a.RoleId = @DummyRoleId';
END
IF(@ModuleId IS NOT NULL)
BEGIN
IF(@HasWhere=0)
BEGIN
SET @QueryString = @QueryString + ' WHERE a.ModuleId = @DummyModuleId';
SET @HasWhere=1;
END
ELSE SET @QueryString = @QueryString + ' AND a.ModuleId = @DummyModuleId';
END
IF(@CanAdd IS NOT NULL)
BEGIN
IF(@HasWhere=0)
BEGIN
SET @QueryString = @QueryString + ' WHERE a.CanAdd = @DummyCanAdd';
SET @HasWhere=1;
END
ELSE SET @QueryString = @QueryString + ' AND a.CanAdd = @DummyCanAdd';
END
IF(@CanEdit IS NOT NULL)
BEGIN
IF(@HasWhere=0)
BEGIN
SET @QueryString = @QueryString + ' WHERE a.CanEdit = @DummyCanEdit';
SET @HasWhere=1;
END
ELSE SET @QueryString = @QueryString + ' AND a.CanEdit = @DummyCanEdit';
END
IF(@CanDelete IS NOT NULL)
BEGIN
IF(@HasWhere=0)
BEGIN
SET @QueryString = @QueryString + ' WHERE a.CanDelete = @DummyCanDelete';
SET @HasWhere=1;
END
ELSE SET @QueryString = @QueryString + ' AND a.CanDelete = @DummyCanDelete';
END
IF(@CreatedDatetime IS NOT NULL)
BEGIN
IF(@HasWhere=0)
BEGIN
SET @QueryString = @QueryString + ' WHERE a.CreatedDatetime = @DummyCreatedDatetime';
SET @HasWhere=1;
END
ELSE SET @QueryString = @QueryString + ' AND a.CreatedDatetime = @DummyCreatedDatetime';
END
IF(@LastAccessDatetime IS NOT NULL)
BEGIN
IF(@HasWhere=0)
BEGIN
SET @QueryString = @QueryString + ' WHERE a.LastAccessDatetime = @DummyLastAccessDatetime';
SET @HasWhere=1;
END
ELSE SET @QueryString = @QueryString + ' AND a.LastAccessDatetime = @DummyLastAccessDatetime';
END
IF(@Deleted IS NOT NULL)
BEGIN
IF(@HasWhere=0)
BEGIN
SET @QueryString = @QueryString + ' WHERE a.Deleted = @DummyDeleted';
SET @HasWhere=1;
END
ELSE SET @QueryString = @QueryString + ' AND a.Deleted = @DummyDeleted';
END
PRINT @QueryString
EXECUTE SP_EXECUTESQL @QueryString
,N'@DummyAccessRightId int, @DummyRoleId int, @DummyModuleId int, @DummyCanAdd char(1), @DummyCanEdit char(1), @DummyCanDelete char(1), @DummyCreatedDatetime datetime, @DummyLastAccessDatetime datetime, @DummyDeleted char(1)'
,@DummyAccessRightId=@AccessRightId
,@DummyRoleId=@RoleId
,@DummyModuleId=@ModuleId
,@DummyCanAdd=@CanAdd
,@DummyCanEdit=@CanEdit
,@DummyCanDelete=@CanDelete
,@DummyCreatedDatetime=@CreatedDatetime
,@DummyLastAccessDatetime=@LastAccessDatetime
,@DummyDeleted=@Deleted;
여기서 스토어드 프로시저의 입력 파라미터를 다음과 같이 null로 초기화합니다.
@AccessRightId int=null,
@RoleId int=null,
@ModuleId int=null,
@CanAdd char(1)=null,
@CanEdit char(1)=null,
@CanDelete char(1)=null,
@CreatedDatetime datetime=null,
@LastAccessDatetime datetime=null,
@Deleted char(1)=null
나한테는 효과가 있었어
나는 이것이 비슷한 함정에 빠진 사람에게 도움이 되기를 바란다.
Template(템플릿)가 설정되지 않은 경우(예: ==emplate) 이 오류도 발생합니다.
기타 코멘트:
매개 변수를 추가할 때까지 매개 변수 값을 알고 있는 경우 AddWithValue를 사용할 수도 있습니다.
EXEC은 필요 없습니다.SELECT에서 @template 파라미터를 직접 참조할 수 있습니다.
저도 같은 문제에 부딪혔어요.그리고 내 파라미터는 null 값이었다.그래서 null 값을 처리하여 해결했습니다.런타임 값을 잘 몰라서 null을 처리하려면 이 값을 사용하십시오. (SP/함수는 변경하지 않습니다.) 예:
sp.Value = Template ?? (object)DBNull.Value;
혹시 누가 올까 봐 검색해봐기본 파라미터 값이 정의되어 있는데도 이 오류가 발생할 경우(이 파라미터를 명시적으로 전달하지 않고 프로시저를 실행할 수 있습니다), 다음과 같이 기본값을 실제로 설정했는지 다시 확인합니다.
@someTextParameter NVARCHAR(100) NULL
됩니다.NULL
뭇매를 맞다
@someTextParameter NVARCHAR(100) = NULL
는 실제로 파라미터를 옵션이라고 선언하고 있습니다.
30분이나 걸려서 못 본 척한 건 바보 같은 실수야;)
첫 번째 - 왜 EXEC입니까?그냥 그렇게 해야 되는 거 아니야?
AS
SELECT Column_Name, ...
FROM ...
WHERE TABLE_NAME = @template
현재 SP가 말이 안 된다고?특히 @template의 varchar 값이 아닌 @template와 일치하는 컬럼을 찾습니다.즉, @template가'Column_Name'
하다, 하다.WHERE TABLE_NAME = Column_Name
(테이블과 컬럼의 이름이 같은 경우는 거의 없습니다).
또한 동적 SQL을 사용해야 하는 경우EXEC sp_ExecuteSQL
(입력 연계가 아닌) 주입 공격을 방지하기 위해 값을 파라미터로 유지합니다.하지만 이 경우에는 그럴 필요가 없습니다.
실제 문제 - 언뜻 보기에는 문제가 없는 것 같습니다.SP의 다른 복사가 없는 것이 확실합니까?이것은 일반적인 오류입니다.
오늘 저장 프로시저의 파라미터에 null 값이 전달되었을 때 이 오류가 발생했습니다.디폴트값=null을 추가하여 저장 프로시저를 변경하여 쉽게 수정할 수 있었습니다.
저도 같은 문제가 있었습니다.이 문제를 해결하려면 저장 프로시저와 동일한 파라미터 이름을 파라미터 컬렉션에 추가합니다.
예
저장 프로시저를 만든다고 가정해 보겠습니다.
create procedure up_select_employe_by_ID
(@ID int)
as
select *
from employe_t
where employeID = @ID
따라서 저장 프로시저에 있는 그대로 파라미터의 이름을 정확하게 지정하십시오.
cmd.parameter.add("@ID", sqltype,size).value = @ID
간다면
cmd.parameter.add("@employeID", sqltype,size).value = @employeid
에러가 발생합니다.
언급URL : https://stackoverflow.com/questions/368642/procedure-expects-parameter-which-was-not-supplied
'it-source' 카테고리의 다른 글
Git 푸시에는 사용자 이름과 비밀번호가 필요합니다. (0) | 2023.04.11 |
---|---|
WPF WPF에서 SVG 파일을 아이콘으로 사용하는 올바른 방법은 무엇입니까? (0) | 2023.04.11 |
5: 5: ★★★★★★★★★★★★★★★★★★? 5: 5: ★★★★★★★★★★★★★★★★★★? 5: 5: ★★★★★★★★★★★★★★★★★★?,,, , 「」 , 「」 , 「」 (0) | 2023.04.11 |
SQL Server IIF와 케이스 (0) | 2023.04.11 |
SQL이 작동하지 않음 (0) | 2023.04.11 |