2012-09-19 3 views
1

끝에서부터 실행할 때 완벽하게 작동하는 저장 프로 시저를 만들었습니다. 그리고 별도의 SQL 쿼리 창에서 저장 프로 시저의 쿼리를 지나치지 만 EXEC sp_Name을 사용하여 SQL 서버에서 실행하면 결과도 오류도 발생하지 않습니다. 내 코드에서 무엇이 잘못되었는지 이해할 수 없다.프런트 엔드에서 실행하면 저장 프로 시저가 제대로 작동하지만 SQL 서버에서 실행할 때 작동하지 않습니다

다음은 내 저장 프로 시저

ALTER PROCEDURE sp_tbl_REQUEST_SelectAllByFilter_WithPagging 
@PageIndex INT=NULL, 
@PageRecord INT=NULL, 
@SortExpression NVARCHAR (200)='int_Request_ID', 
@SortDirection NVARCHAR (10)='ASC', 
@int_Requester_ID INT=NULL, 
@intProjectID INT=NULL 
AS 
BEGIN 
SET NOCOUNT ON 
DECLARE @StartRowIndex INT 
SET @StartRowIndex=((@PageIndex-1)*@PageRecord)+1; 

DECLARE @WhrClause VARCHAR(MAX) 
SET @WhrClause= 'WHERE tr.int_Requester_ID = '+CONVERT(VARCHAR(MAX), @int_Requester_ID) 
IF(@intProjectID>0) 
BEGIN 
    SET @[email protected]+' AND tr.int_Project_ID='+CONVERT(VARCHAR(MAX),@intProjectID) 
END 
DECLARE @SelectClause VARCHAR(MAX) 
SET @SelectClause=';With AllRecords AS(SELECT Row_Number() OVER(ORDER BY '+CONVERT (VARCHAR (MAX), @SortExpression)+' '+CONVERT (VARCHAR (MAX), @SortDirection)+')AS ''RowNumber'',* FROM(SELECT tr.[int_Request_ID],   
     tr.[int_User_ID],   
     tr.[int_Project_ID],   
     tr.[str_Request_Type],   
     tr.[int_Account_ID],   
     tr.[int_Requester_ID],   
     tr.[int_User_Head_ID],   
     tr.[dt_Request_Date],   
     tr.[bln_IsApproved],   
     tr.[dt_Approval_Date],   
     tr.[str_Reject_Reason],   
     tr.[int_USER_ROLE],   
     tr.[int_AllocationType_ID],   
     tr.[int_NoofHourInMinute],   
xyz.dbo.GetHourByMin(ISNULL(int_NoofHourInMinute,0)) as ''str_NoofHour'',   
     tr.[dt_StartDateToWork], 
     tr.[dt_EndDateToWork],   
     tr.[isAllowToAddTask],   
     tr.[isAllowToDeleteTask],   
     tr.[isAllowToAddCR],   
     tp.str_Project_Name,   
     tu.str_FullName AS str_User_Name,   
     tu1.str_FullName AS UserHeader,   
     tbl_Project_AllocationType.str_AllocationType,  
     tu2.str_FullName AS UserRequester, 
    tu2.str_EMAIL_ADDRESS as RequesterEmail  
    FROM [tbl_Requests] tr   
    INNER JOIN tbl_PROJECT tp ON tp.int_Project_ID = tr.int_Project_ID   
    INNER JOIN tbl_USER tu ON tu.int_USER_ID=tr.int_User_ID   
    LEFT JOIN tbl_USER tu1 ON tu1.int_USER_ID=tr.int_User_Head_ID   
    INNER JOIN tbl_USER tu2 ON tu2.int_USER_ID=tr.int_Requester_ID  
inner join tbl_Project_AllocationType on tbl_Project_AllocationType.int_AllocationType_ID=tr.int_AllocationType_ID '[email protected]+' 
)As Tmp) 

    SELECT * FROM 
AllRecords WHERE RowNumber BETWEEN ' + CONVERT(VARCHAR(MAX), @StartRowIndex) + ' AND ' + CONVERT(VARCHAR(MAX), (@StartRowIndex + @PageRecord - 1)) + ' 

SELECT COUNT(TempTbl.int_Request_ID)As ''ReturnRecords'','+CONVERT(VARCHAR(MAX),@PageIndex)+'''PageIndex'' 
FROM (SELECT tr.[int_Request_ID]  
FROM [tbl_Requests] tr '[email protected]+')as TempTbl;' 

PRINT(@SelectClause) 
DECLARE @SQL NVARCHAR(MAX) 
SET @SQL=CONVERT(NVARCHAR(MAX),@SelectClause) 
EXEC sp_executesql @SQL 
END 

나는이처럼 실행하고있다.

EXEC sp_tbl_REQUEST_SelectAllByFilter_WithPagging 1,20,NULL,NULL,74,591 

답변

3

당신은 @SortExpression@SortDirection에 대한 NULL을 전달하고 있습니다. NULL은 기본값이 적용되지 않음을 의미하며 대신 null입니다. (합치 문자열과 NULLNULL의 생산 때문에)

그래서 @SelectClause으로 전체 연결은

은 그래서 아무것도 실행되지 않습니다 NULL된다.

시도 :

EXEC sp_tbl_REQUEST_SelectAllByFilter_WithPagging 
     1,20,@int_Requester_ID = 74,@intProjectID=591 

덧붙여, 당신은 저장 프로 시저에 대한 접두사로 sp_를 사용을 피해야한다. sp_ 접두사는 MS에서 시스템 저장 프로 시저 용으로 예약되어 있으며 이름 충돌이 발생하면 SQL Server는 시스템 저장 프로 시저 (master)를 자신의 프로 시저보다 선호합니다.

(I 일반적으로 SQL 서버의 모든 접두사를 사용에 대해 권하고 싶습니다하지만 오히려 강한 규칙보다, 논쟁 문제의 더)

2

안녕하세요 당신은 매개 변수는 null를 통과 할 필요가 없습니다

그래서 당신은

EXEC sp_tbl_REQUEST_SelectAllByFilter_WithPagging 1,20, @ int_Requester_ID = 74, @ intProjectID = 591

을 시도 이런 식으로 저장 프로 시저를 실행할 수 있습니다

감사합니다. Amit Vyas

관련 문제