Хпроц ... с пейджингом

ann_dee

Привет всем, есть такая процедура для реализации пейджинга
CREATE PROCEDURE [dbo].[sp_xxx_yyy] 
(
 @startRowIndex int,
 @maximumRows int
)
AS

DECLARE @first_id int, @startRow int
	
SET ROWCOUNT @startRowIndex
SELECT @first_id = AnyID FROM Any ORDER BY AnyID

SET ROWCOUNT @maximumRows

SELECT * 
FROM Any
WHERE AnyID >= @first_id
ORDER BY AnyID

SET ROWCOUNT <b>0</b>

GO
Работает супер, но только если запрос статический. Я не силен в написании скриптов под мс сиквел. Пытаюсь перерулить ее в динамическую, ничего не получается. Вот мой замысел:
ALTER PROCEDURE [dbo].[sp_xxx_yyy] 
(
 @startRowIndex int,
 @maximumRows int,
 @selectas nvarchar(<b>512</b>),
 @fromas nvarchar(<b>512</b>),
 @whereas nvarchar(<b>512</b>),
 @orderas nvarchar(<b>512</b>),
 @idfieldas nvarchar(<b>128</b>)
)
AS

DECLARE @first_id int, @startRow int

SET ROWCOUNT @startRowIndex
EXECUTE('SELECT @first_id = '+@idfieldas+' FROM '+@fromas+@whereas+@orderas)

SET ROWCOUNT @maximumRows

EXECUTE('SELECT '+@selectas+' FROM '+@fromas+@whereas+@idfieldas+' >= '+@first_id+' '+@orderas)

SET ROWCOUNT <b>0</b>


GO
Вызываю вот так
exec sp_xxx_yyy <b>50000</b>, <b>15</b>, 'AnyField', 'AnyTable ', '',' ORDER BY AnyID', 'AnyID'
Получаю такой эрор
Server: Msg <b>137</b>, Level <b>15</b>, State <b>1</b>, Line <b>1</b>
Must declare the variable '@first_id'.
Server: Msg <b>170</b>, Level <b>15</b>, State <b>1</b>, Line <b>1</b>
Line <b>1</b>: Incorrect syntax near '>'.
Догадываюсь что экзек не видит @first_id, но как в нее затолкать полученное значениеПодскажите плиз
11 ответов

ann_dee

FAQ, раздел III.


ann_dee

Про пейджинг - есть статья в фак.Про динамику - сделайте перед exec ('что-то') принт это что-то, скопируйте в новое окно и запустите. Тогда, думаю, вся ясно станет.


ann_dee

ALTER PROCEDURE [dbo].[sp_xxx_yyy] 
(
 @startRowIndex int,
 @maximumRows int,
 @selectas nvarchar(<b>512</b>),
 @fromas nvarchar(<b>512</b>),
 @whereas nvarchar(<b>512</b>),
 @orderas nvarchar(<b>512</b>),
 @idfieldas nvarchar(<b>128</b>)
)
AS

DECLARE @first_id int, 
 @startRow int,
 @stmt nvarchar(<b>4000</b>)

SET ROWCOUNT @startRowIndex
SET @stmt = N'SELECT @first_id = '+@idfieldas+' FROM '+@fromas+@whereas+@orderas

EXEC sp_ExecuteSQL
 @stmt = @stmt,
 @Params = N'@first_id int OUTPUT',
 @first_id = @first_id OUTPUT

SET ROWCOUNT @maximumRows
SET @stmt = N'SELECT '+@selectas+' FROM '+@fromas+@whereas+@idfieldas+' >= '+CAST(@first_id AS varchar(<b>10</b>))+' '+@orderas

EXEC sp_ExecuteSQL @stmt
SET ROWCOUNT <b>0</b>


GO


ann_dee

Привет всем, есть такая процедура для реализации пейджинга
CREATE PROCEDURE [dbo].[sp_xxx_yyy] 
(
 @startRowIndex int,
 @maximumRows int
)
AS

DECLARE @first_id int, @startRow int
	
SET ROWCOUNT @startRowIndex
SELECT @first_id = AnyID FROM Any ORDER BY AnyID

SET ROWCOUNT @maximumRows

SELECT * 
FROM Any
WHERE AnyID >= @first_id
ORDER BY AnyID

SET ROWCOUNT <b>0</b>

GO
Работает супер, но только если запрос статический. Я не силен в написании скриптов под мс сиквел. Пытаюсь перерулить ее в динамическую, ничего не получается. Вот мой замысел:
ALTER PROCEDURE [dbo].[sp_xxx_yyy] 
(
 @startRowIndex int,
 @maximumRows int,
 @selectas nvarchar(<b>512</b>),
 @fromas nvarchar(<b>512</b>),
 @whereas nvarchar(<b>512</b>),
 @orderas nvarchar(<b>512</b>),
 @idfieldas nvarchar(<b>128</b>)
)
AS

DECLARE @first_id int, @startRow int

SET ROWCOUNT @startRowIndex
EXECUTE('SELECT @first_id = '+@idfieldas+' FROM '+@fromas+@whereas+@orderas)

SET ROWCOUNT @maximumRows

EXECUTE('SELECT '+@selectas+' FROM '+@fromas+@whereas+@idfieldas+' >= '+@first_id+' '+@orderas)

SET ROWCOUNT <b>0</b>


GO
Вызываю вот так
exec sp_xxx_yyy <b>50000</b>, <b>15</b>, 'AnyField', 'AnyTable ', '',' ORDER BY AnyID', 'AnyID'
Получаю такой эрор
Server: Msg <b>137</b>, Level <b>15</b>, State <b>1</b>, Line <b>1</b>
Must declare the variable '@first_id'.
Server: Msg <b>170</b>, Level <b>15</b>, State <b>1</b>, Line <b>1</b>
Line <b>1</b>: Incorrect syntax near '>'.
Догадываюсь что экзек не видит @first_id, но как в нее затолкать полученное значениеПодскажите плиз
@first_id равен NULL...Надо ему присвоить значение например:
SELECT @first_id=<b>1</b>
или
SET @first_id=<b>1</b>


ann_dee

К стати... в первом варианте у тебя уже есть это присвоение:
SELECT @first_id = AnyID FROM Any ORDER BY AnyID


ann_dee

@first_id равен NULL...
Сообщение "Must declare the variable" означает, что variable равна null так же, как и сообщение "Invalid object name" означает, что в таблице нет записей.


ann_dee

Сообщение "Must declare the variable" означает, что variable равна null так же, как и сообщение "Invalid object name" означает, что в таблице нет записей.
Ну вообще-то он говорит, что переменная не объявлена... слегка разные вещи...


ann_dee

Ну вообще-то он говорит, что переменная не объявлена... слегка разные вещи...
А Вы говорите, что переменная равна null.


ann_dee

Тройка первый, просто супер:tpg Гавриленко Сергей-=DiM@n=- Мистер tpg, восполнил серьезный пробел в знаниях, спасибо большоеМистер Гавриленко, дал дельный совет бывалого, спасибоМистер -=DiM@n=- сделал все за меня, но чуть позже, хе хеВсем остальным большое спасибо


ann_dee

Сергей Алексеевич, мы говорим немного о разных вещах.Когда я сказал, что переменная имеет null значение, я говорил о процедуре... Он там объявлена.В строке же, которая выдернута из процедуры, используеться переменная, но она не объявлена. Поэтому он и ругаеться на declare the variable


ann_dee

... хе хеВсем остальным большое спасибо
and stop using sp_ prefix