2010-08-07 5 views
0

의 일반 SQL 저장 프로 시저에 대한 도움이 필요하십니까 I했습니다 2005 일반적으로 페이지 매김을위한 데이터베이스 내 SQL 서버에 저장 절차에 따라 만들어 내 매개 변수는 페이지 매김

USE [training] 
GO 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
CREATE PROCEDURE [dbo].[usp_Pagination1] 
    -- Add the parameters for the stored procedure here 
    @SqlColumns VARCHAR(MAX), 
    @SqlFriendlyColumns VARCHAR(MAX), 
    @SqlTableClause VARCHAR(MAX), 
    @StartRow INT, 
    @EndRow INT, 
    @SqlWhere VARCHAR(MAX), 
    @SqlOuterWhere VARCHAR(MAX), 
    @SqlRowNumOrderBy VARCHAR(MAX), 
    @SqlOuterOrderBy VARCHAR(MAX) 
AS 
DECLARE @rsSQL NVARCHAR(MAX) 
DECLARE @rcSQL NVARCHAR(MAX) 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 
/* 
sample dynamically created SQL: 
    WITH PersonContact AS 
    ( 
     SELECT PC.FirstName, PC.LastName, PC.EmailAddress, 
     ROW_NUMBER() OVER(ORDER BY PC.ContactID) AS RowNumber 
     FROM Person.Contact PC 
    ) 
    SELECT FirstName, LastName, EmailAddress 
    FROM PersonContact 
    WHERE RowNumber > @StartRow AND RowNumber < @EndRow 
    ORDER BY LastName DESC, EmailAddress 
*/ 
    -- build pagination SQL, using StartRow and EndRow to determine 
    -- which results to output 
    SET @rsSQL = N' WITH tempTable AS (' + 
     N' SELECT ' + 
      @SqlColumns + 
     N' , ROW_NUMBER() OVER(ORDER BY ' + 
      @SqlRowNumOrderBy + 
     N') AS RowNumber ' + 
     N' FROM ' + 
      @SqlTableClause 
    IF @SqlWhere + '' <> '' 
     BEGIN 
      SET @rsSQL = @rsSQL +     
       N' WHERE ' + 
        @SqlWhere 
     END 
    SET @rsSQL = @rsSQL + 
     N') SELECT ' + 
      @SqlFriendlyColumns + 
     N' FROM tempTable ' + 
     N' WHERE RowNumber >= ' + 
      CAST(@StartRow AS NVARCHAR(32)) + 
     N' AND RowNumber <= ' + 
      CAST(@EndRow AS NVARCHAR(32)) + 
     N' ORDER BY ' + 
      @SqlOuterOrderBy 

    -- uncomment PRINT to debug 
    PRINT @rsSQL 
    EXEC sp_executesql @rsSQL 
    -- build second recordset simple for the count 
    SET @rcSQL = 
      N'SELECT COUNT(*) AS CountAll FROM ' + 
       @SqlTableClause 
    IF @SqlOuterWhere + '' <> '' 
     BEGIN 
      SET @rcSQL = @rcSQL +     
       N' WHERE ' + 
         @SqlOuterWhere 
     END 

    EXEC sp_executesql @rcSQL  
    SET NOCOUNT OFF; 
END 

실행 된 절차 :

USE [training] 
GO 

EXEC [dbo].[usp_Pagination1] 
     @SqlColumns = N'tab1.categoryId,tab1.categoryName,tab1.description,tab1.parentCategory,tab2.categoryName AS parentCategoryName', 
     @SqlFriendlyColumns = N'categoryId,categoryName,description,parentCategory,parentCategoryName', 
     @SqlTableClause = N'vpCategory tab1 LEFT JOIN vpCategory tab2 ON tab1.parentCategory = tab2.categoryId', 
     @StartRow = 1, 
     @EndRow = 1, 
     @SqlWhere = N'tab1.categoryId = 1', 
     @SqlOuterWhere = N'categoryId = 1', 
     @SqlRowNumOrderBy = N'tab1.categoryId', 
     @SqlOuterOrderBy = N'categoryId' 

GO 

내 테이블 vpCategory에 대해 실행하면 메시지가 나타납니다. msg 209, Level 16, State 1, Line 1 모호한 열 이름 'categoryId'.

그러나 결과 탭에서 올바른 결과를 제공합니다.

또한

메시지 탭이 날 쿼리를 다음 부여하는이 절차에 의해 건설되고있다 : 나는 새 창에서 위의 쿼리를 실행하면

WITH tempTable AS ( SELECT tab1.categoryId,tab1.categoryName,tab1.description,tab1.parentCategory,tab2.categoryName AS parentCategoryName , ROW_NUMBER() OVER(ORDER BY tab1.categoryId) AS RowNumber FROM vpCategory tab1 LEFT JOIN vpCategory tab2 ON tab1.parentCategory = tab2.categoryId WHERE tab1.categoryId = 1) SELECT categoryId,categoryName,description,parentCategory,parentCategoryName FROM tempTable WHERE RowNumber >= 1 AND RowNumber <= 1 ORDER BY categoryId 

, 그것은 나에게 오류를 제공하지 않습니다!

저장 프로 시저에 문제가있는 부분을 도와 줄 사람이 있습니까?

+3

제 말은 상관 없습니다. 모든 동적 SQL이 프로 시저에서 진행되는 경우 스토어드 프로 시저가 전혀 필요하지 않습니다. 이 절차를 호출하기 전에 고객이 SQL 주입을 방지하기 위해 입력의 유효성을 검사하고 위생적으로 처리해야합니다. – kbrimington

+1

정확히 테이블 또는 쿼리에 페이지 매김이 필요한지를 정확하게 결정한 다음 이러한 명시적인 시나리오를 처리하기 위해 저장 프로 시저를 빌드하는 것이 더 바람직하지 않습니까? – RobS

+0

@kbrimington에 동의합니다. 프로그래밍 언어의 동적 쿼리를 사용하여 저장 프로 시저 호출을 변경합니다. – Vikas

답변

0

알 수 있습니다.

사실 우리는 바깥 쪽을 요구합니다.

때문이다 :

ALTER PROCEDURE [dbo].[usp_Pagination] 
    -- Add the parameters for the stored procedure here 
    @SqlColumns VARCHAR(MAX), 
    @SqlFriendlyColumns VARCHAR(MAX), 
    @SqlTableClause VARCHAR(MAX), 
    @StartRow INT, 
    @EndRow INT, 
    @SqlWhere VARCHAR(MAX), 
    @SqlRowNumOrderBy VARCHAR(MAX), 
    @SqlOuterOrderBy VARCHAR(MAX) 
AS 
DECLARE @rsSQL NVARCHAR(MAX) 
DECLARE @rcSQL NVARCHAR(MAX) 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 
/* 
sample dynamically created SQL: 
    WITH PersonContact AS 
    ( 
     SELECT PC.FirstName, PC.LastName, PC.EmailAddress, 
     ROW_NUMBER() OVER(ORDER BY PC.ContactID) AS RowNumber 
     FROM Person.Contact PC 
    ) 
    SELECT FirstName, LastName, EmailAddress 
    FROM PersonContact 
    WHERE RowNumber > @StartRow AND RowNumber < @EndRow 
    ORDER BY LastName DESC, EmailAddress 
*/ 
    -- build pagination SQL, using StartRow and EndRow to determine 
    -- which results to output 
    SET @rsSQL = N' WITH tempTable AS (' + 
     N' SELECT ' + 
      @SqlColumns + 
     N' , ROW_NUMBER() OVER(ORDER BY ' + 
      @SqlRowNumOrderBy + 
     N') AS RowNumber ' + 
     N' FROM ' + 
      @SqlTableClause 
    IF @SqlWhere + '' <> '' 
     BEGIN 
      SET @rsSQL = @rsSQL +     
       N' WHERE ' + 
        @SqlWhere 
     END 
    SET @rsSQL = @rsSQL + 
     N') SELECT ' + 
      @SqlFriendlyColumns + 
     N' FROM tempTable ' + 
     N' WHERE RowNumber >= ' + 
      CAST(@StartRow AS NVARCHAR(32)) + 
     N' AND RowNumber <= ' + 
      CAST(@EndRow AS NVARCHAR(32)) + 
     N' ORDER BY ' + 
      @SqlOuterOrderBy 

    -- uncomment PRINT to debug 
    PRINT @rsSQL 
    EXEC sp_executesql @rsSQL 
    -- build second recordset simple for the count 
    SET @rcSQL = 
      N'SELECT COUNT(*) AS CountAll FROM ' + 
       @SqlTableClause 
    IF @SqlWhere + '' <> '' 
     BEGIN 
      SET @rcSQL = @rcSQL +     
       N' WHERE ' + 
        @SqlWhere 
     END 

    EXEC sp_executesql @rcSQL  
    SET NOCOUNT OFF; 
END 
0

이 두 번째 sp_executesql을이 오류를 생성 할 수 있었던 것처럼 -THE @SqlOuterWhere이 카테고리 ID 열에 별칭을 사용해야합니다 같습니다.