【问题标题】:SQL Server : custom paging stored procedureSQL Server:自定义分页存储过程
【发布时间】:2018-03-26 17:33:40
【问题描述】:

我有一个这样的存储过程:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[zsp_GetUsersAdministratorPanel]
    (@StartRowIndex  INT,
     @MaxRows INT,
     @OrderByField NVARCHAR(200),
     @Asc BIT,
     @SearchValue NVARCHAR(200))
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @UsersTable TABLE(UserId uniqueidentifier,
                              FirstName nvarchar(400),
                              LastName nvarchar(400),
                              Email nvarchar(200)
                             )

    DECLARE @WhereQuery nvarchar(max)

    SET @WhereQuery = ' WHERE '

    IF LEN(@SearchValue) > 0
    BEGIN
        SET @WhereQuery = @WhereQuery +
                  'FirstName like ''%' + @SearchValue + '%''  or '
                + ' LastName like ''%' + @SearchValue + '%''  or '
                + ' Email like ''%' + @SearchValue + '%'''
    END

    DECLARE @OrderQuery nvarchar(max)

    IF LEN(@OrderByField) > 0
    BEGIN
        IF @OrderByField = 'Email'
            SET @OrderQuery = ' ORDER BY Email ' +
                    CASE @Asc WHEN 1 THEN ' ASC ' ELSE ' DESC ' END
        ELSE IF @OrderByField = 'FirstName'
            SET @OrderQuery = ' ORDER BY FirstName ' +  
                    CASE @Asc WHEN 1 THEN ' ASC ' ELSE ' DESC ' END
        ELSE IF @OrderByField = 'LastName'  
            SET @OrderQuery = ' ORDER BY LastName ' +  
                    CASE @Asc WHEN 1 THEN ' ASC ' ELSE ' DESC ' END
    END 

    DECLARE @Query  NVARCHAR(MAX)
    SET @Query = 'select UserId, 
                FirstName,
                LastName,
                Email
            from 
            (
                SELECT  ROW_NUMBER() OVER ('+ @OrderQuery +')
                    AS [ROW_NUMBER], 
                        [t0].[UserId], [t0].[FirstName], 
                        [t0].[LastName], 
                        [t0].[Email]
                        FROM [dbo].[Users] AS [t0]' +
                        @WhereQuery +
            ') AS [t1]' +
                 + ' WHERE [ROW_NUMBER] BETWEEN 
                    @StartRowIndex AND @MaxRows' + @OrderQuery

    PRINT @Query

    INSERT INTO @UsersTable 
        EXEC sp_Executesql @Query,
                    N'@OrderQuery nvarchar(max),
                    @StartRowIndex int,@MaxRows int',
                    @OrderQuery=@OrderQuery,
                    @StartRowIndex = @StartRowIndex,
                    @MaxRows = @MaxRows

    SELECT * FROM @UsersTable           

    SET NOCOUNT OFF;
END

当我传递以下参数时:

StartRowIndex - 1
MaxRows(page size) - 50
OrderByField - FirstName
Asc - 1
SearchValue - Test

我收到以下错误:

select UserId, 
                FirstName,
                LastName,
                Email
            from 
            (


                SELECT  ROW_NUMBER() OVER ( ORDER BY FirstName  ASC )
                    AS [ROW_NUMBER], 
                        [t0].[UserId], [t0].[FirstName], 
                        [t0].[LastName], 
                        [t0].[Email]
                        FROM [dbo].[Users] AS [t0] WHERE FirstName like '%test%'  or  LastName like '%test%'  or  Email like '%test%') AS [t1] WHERE [ROW_NUMBER] BETWEEN 
                    @StartRowIndex AND @MaxRows ORDER BY FirstName  ASC 

消息 206,第 16 级,状态 2,第 4 行
操作数类型冲突:int 与 uniqueidentifier 不兼容

我不太确定是什么导致了这里的错误...我正在尝试创建一个存储过程,该过程将通过我的用户测试表,该表将包含大量数据(稍后将有 500000 个用户),所以我正在努力确保流畅的用户体验。

为什么会出现这个错误?

谁能帮帮我?

【问题讨论】:

  • UserId’ on dbo.Users`的类型是什么?
  • @TZHX 我声明为:int identity(1,1) 主键
  • 你能看出这以及你对@UsersTable 的定义会导致你收到错误吗?
  • 我看不出你想要实现什么目的,将数据插入临时表只是为了选择它?这似乎很浪费。如果所有的小枝只打算选择它,只需选择它。

标签: sql sql-server stored-procedures paging procedure


【解决方案1】:

简单的答案是 int 与 uniqueidentifier 的类型不同。这实际上是两种不同的数据类型。

http://www.sqlteam.com/article/uniqueidentifier-vs-identity

说明 uniqueidentifier 是一个 16 字节的二进制值。

DECLARE @UsersTable TABLE(UserId uniqueidentifier,

应该是

DECLARE @UsersTable TABLE(UserId int,

cmets 在回答您的问题时提出了其他程序的其他问题,但这专门解决了您遇到的错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-20
    • 1970-01-01
    • 1970-01-01
    • 2018-04-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多