2013-10-20 41 views
3

我想這個存儲過程:SQL Server存儲過程需要聲明標量

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

CREATE PROCEDURE [dbo].[spx_Pager] 
    @PageNo int = 1, 
    @ItemsPerPage int = 2, 
    @TotalRows int out 
AS 
BEGIN 
    SET NOCOUNT ON 
    DECLARE 
    @StartIdx int, 
    @SQL nvarchar(max), 
    @SQL_Conditions nvarchar(max), 
    @EndIdx int 

    IF @PageNo < 1 SET @PageNo = 1 
    IF @ItemsPerPage < 1 SET @ItemsPerPage = 10 

    SET @StartIdx = (@PageNo -1) * @ItemsPerPage + 1 
    SET @EndIdx = (@StartIdx + @ItemsPerPage) - 1 
    SET @SQL = 'SELECT FilePath 
       FROM (
       SELECT ROW_NUMBER() OVER(ORDER BY ID) AS Row, * 
         FROM tblFiles) AS tbl WHERE Row >= ' 
         + CONVERT(varchar(9), @StartIdx) + ' AND 
         Row <= ' + CONVERT(varchar(9), @EndIdx) 
    EXEC sp_executesql @SQL 

    SET @SQL = 'SELECT @TotalRows=COUNT(*) FROM tblFiles' 
    EXEC sp_executesql 
     @query = @SQL, 
     @params = N'@TotalRows INT OUTPUT', 
     @TotalRows = @TotalRows OUTPUT 
END 

它運作良好,但我想,以期在這裏擴展它是代碼

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

alter PROCEDURE [dbo].[spx_Pager] 
    @PageNo int = 1, 
    @ItemsPerPage int = 2, 
    @TotalRows int out, 
    @fname varchar(50), 
    @mname varchar(50), 
    @lname varchar(50), 
    @qfr varchar(10) 
AS 
BEGIN 
    SET NOCOUNT ON 
    DECLARE 
    @StartIdx int, 
    @SQL nvarchar(max), 
    @SQL_Conditions nvarchar(max), 
    @EndIdx int 

    IF @PageNo < 1 SET @PageNo = 1 
    IF @ItemsPerPage < 1 SET @ItemsPerPage = 10 

    SET @StartIdx = (@PageNo -1) * @ItemsPerPage + 1 
    SET @EndIdx = (@StartIdx + @ItemsPerPage) - 1 
    SET @SQL = N'SELECT path_front 
       FROM (
       SELECT ROW_NUMBER() OVER(ORDER BY fname) AS Row, * 
         FROM searcherview 
         where (fname = @fname or @fname = '') and (mname = @mname or @mname = '') and (lname = @lname or @lname = '') and (qualifier = @qfr or @qfr = '') 
         ) AS tbl WHERE Row >= ' 
         + CONVERT(varchar(9), @StartIdx) + ' AND 
         Row <= ' + CONVERT(varchar(9), @EndIdx) 
    EXEC sp_executesql @SQL 

    SET @SQL = 'SELECT @TotalRows=COUNT(*) FROM searcherview' 
    EXEC sp_executesql 
     @query = @SQL, 
     @params = N'@TotalRows INT OUTPUT', 
     @TotalRows = @TotalRows OUTPUT 
END 

但是當我嘗試執行存儲過程錯誤返回它說

必須聲明標量變量「@fname」

回答

3

如果您使用的是變量的sp_executesql你需要定義它們,因爲你是在做你的第二sp_executesql

@params = N'@TotalRows INT OUTPUT', 
@TotalRows = @TotalRows OUTPUT 

所以,你需要

@params = N'@fname varchar(50), @mname varchar(50), @lname varchar(50), @qualifier varchar(10)', 
@fname = @fname, @mname = @mname, @[email protected], @qualifier = @qfr 

添加到您的第一sp_executesql請致電

雖然爲什麼您使用動態SQL根本沒有立即顯現給我。

如果您使用SQL 2012,你可能有興趣在OFFSETFETCH命令

+0

我使用2008 R2我想你建議,但它說Msg 102,級別15,狀態1,過程spx_Pager,行34 '@params'附近語法不正確。 – angelogogo

+0

@angelogogo你可能錯過了SQL – podiluska

+0

之後的逗號謝謝你 – angelogogo

1
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

alter PROCEDURE [dbo].[spx_Pager](
    @PageNo int = 1, 
    @ItemsPerPage int = 2, 
    @TotalRows int out, 
    @fname varchar(50), 
    @mname varchar(50), 
    @lname varchar(50), 
    @qfr varchar(10) 
    ) 
AS 
BEGIN 
    SET NOCOUNT ON 
    DECLARE 
    @StartIdx int, 
    @SQL nvarchar(max), 
    @SQL_Conditions nvarchar(max), 
    @EndIdx int 

    IF @PageNo < 1 SET @PageNo = 1 
    IF @ItemsPerPage < 1 SET @ItemsPerPage = 10 

    SET @StartIdx = (@PageNo -1) * @ItemsPerPage + 1 
    SET @EndIdx = (@StartIdx + @ItemsPerPage) - 1 
    SET @SQL = N'SELECT path_front 
       FROM (
       SELECT ROW_NUMBER() OVER(ORDER BY fname) AS Row, * 
         FROM searcherview 
         where (fname = @firstname or @firstname = '') and (mname = @midname or @midname = '') and (lname = @lastname or @lastname = '') and (qualifier = @quali or @quali = '') 
         ) AS tbl WHERE Row >= ' 
         + CONVERT(varchar(9), @StartIdx) + ' AND 
         Row <= ' + CONVERT(varchar(9), @EndIdx) 
    EXEC sp_executesql @SQL, 
    @params = N'@firstname varchar(50), @midname varchar(50), @lastname varchar(50), @quali varchar(10)', 
    @firstname = @fname, @midname = @mname, @[email protected], @quali = @qfr 

    SET @SQL = 'SELECT @TotalRows=COUNT(*) FROM searcherview' 
    EXEC sp_executesql 
     @query = @SQL, 
     @params = N'@TotalRows INT OUTPUT', 
     @TotalRows = @TotalRows OUTPUT 
END 

最終代碼和它的工作多虧@podiluska