【发布时间】: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’ ondbo.Users`的类型是什么? -
@TZHX 我声明为:int identity(1,1) 主键
-
你能看出这以及你对
@UsersTable的定义会导致你收到错误吗? -
我看不出你想要实现什么目的,将数据插入临时表只是为了选择它?这似乎很浪费。如果所有的小枝只打算选择它,只需选择它。
标签: sql sql-server stored-procedures paging procedure