2011-11-20 5 views
1

모든 저장 프로 시저오류 쿼리

전달되는 경우 오류 '잘못된 열 이름 값 @user 아이디'

매개 변수 쿼리 vlaue의 @userid을 실행

USE [amozeshgah] 
GO 
/****** Object: StoredProcedure [dbo].[selectmanageregistercourse] ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
ALTER PROCEDURE [dbo].[selectmanageregistercourse] 
@iddore int, 
@stateregister int, 
@userid nvarchar(350) 
AS 
declare @str nvarchar(900) 
BEGIN 
SET @str= 'SELECT tblUserRegisterDore.id, tblUserRegisterDore.idcourse, tblUserRegisterDore.iddore, tblUserRegisterDore.userid, tblUserRegisterDore.coderegister, tblUserRegisterDore.fish, tblUserRegisterDore.date, tblUserRegisterDore.statefish, tblUserRegisterDore.stateregister, tbluser.name, tbldore.name AS namesubcourse, tblmozedore.name AS namecourse, tbluser.family FROM tblUserRegisterDore INNER JOIN tblmozedore ON tblUserRegisterDore.idcourse = tblmozedore.id INNER JOIN tbldore ON tblUserRegisterDore.iddore = tbldore.id AND tblmozedore.id = tbldore.idmozedore INNER JOIN tbluser ON tblUserRegisterDore.userid = tbluser.userid where iddore='+convert(nvarchar(100),@iddore) 
if (@stateregister<>-1) 
begin 
set @str +=' and stateregister='+ convert(varchar(100),@stateregister) 
end 
if (@userid <>'-1') 
begin 
set @str +=' and tblUserRegisterDore.userid='+ @userid 
end 
EXEC sp_executesql @str 
END 

EXEC @return_value = [dbo].[selectmanageregistercourse] 
     @iddore = 3, 
     @stateregister = 1, 
     @userid = N'fdfsdf' 

오류 msg, 수준 16, 상태 1, 줄 1 잘못된 'fdfsdf'열 이름입니다.

왜?

+0

당신이 과정에 무엇을 전달 보여 주 시겠어요해야 하는가? 문제는 입력 값에 있다고 생각합니다. – bperreault

답변

1

여기에는 많은 문제가 있으며 서버에 사용중인 파일이 아닙니다. 여기

은 SP를 작성하고 동적 SQL을 사용하지 않는 방법 - 그것은 사용하는 것이 훨씬 빠르고 쉬울 것입니다 :

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
ALTER PROCEDURE [dbo].[selectmanageregistercourse] 
@iddore int, 
@stateregister int, 
@fish nvarchar(350) 
AS 
BEGIN 
    SELECT tblUserRegisterDore.id, tblUserRegisterDore.idcourse, tblUserRegisterDore.iddore, 
      tblUserRegisterDore.userid, tblUserRegisterDore.coderegister, tblUserRegisterDore.fish, tblUserRegisterDore.date, 
      tblUserRegisterDore.statefish, tblUserRegisterDore.stateregister, tbluser.name, tbldore.name AS namesubcourse, 
      tblmozedore.name AS namecourse, tbluser.family 
    FROM tblUserRegisterDore 
    INNER JOIN tblmozedore ON tblUserRegisterDore.idcourse = tblmozedore.id 
    INNER JOIN tbldore ON tblUserRegisterDore.iddore = tbldore.id AND tblmozedore.id = tbldore.idmozedore 
    INNER JOIN tbluser ON tblUserRegisterDore.userid = tbluser.userid 
    WHERE [email protected] 
    AND ((@stateregister =-1) OR ([email protected])) 
    AND ((@fish ='-1') OR ([email protected])) 
END 

당신이

이상 사용하는 경우 이전 댓글이 더 이상 적용

그러나 여기에는 한 가지 문제가 있습니다. varchar이 있으며 작성중인 동적 SQL에서 따옴표를 사용하지 않습니다.

set @str +=' and tblUserRegisterDore.fish='+ @fish 

set @str +=' and tblUserRegisterDore.fish='''+ @fish + '''' 
+0

귀하의 도움 덕분에 – user1045472

+0

따옴표에 좋은 캐치. 이 경우'set @str + N '과 tblUserRegisterDore.fish =' ''+ ...'와 같이 문자열 상수 앞에'N '을 붙이는 것이 더 안전 할 수도 있다고 덧붙일 것입니다. –