의 일반 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
, 그것은 나에게 오류를 제공하지 않습니다!
저장 프로 시저에 문제가있는 부분을 도와 줄 사람이 있습니까?
제 말은 상관 없습니다. 모든 동적 SQL이 프로 시저에서 진행되는 경우 스토어드 프로 시저가 전혀 필요하지 않습니다. 이 절차를 호출하기 전에 고객이 SQL 주입을 방지하기 위해 입력의 유효성을 검사하고 위생적으로 처리해야합니다. – kbrimington
정확히 테이블 또는 쿼리에 페이지 매김이 필요한지를 정확하게 결정한 다음 이러한 명시적인 시나리오를 처리하기 위해 저장 프로 시저를 빌드하는 것이 더 바람직하지 않습니까? – RobS
@kbrimington에 동의합니다. 프로그래밍 언어의 동적 쿼리를 사용하여 저장 프로 시저 호출을 변경합니다. – Vikas