2014-02-06 4 views
1

Я хотел бы, чтобы суммарный счетчик строк был как выходной параметр, к которому позже будет доступен доступ с C#. Этот запрос выдает ошибку - Недопустимое имя объекта «TBL»Как перенастроить выходной параметр из хранимой процедуры

ALTER PROCEDURE [dbo].[GetOrderDetails] 
    @SortOrder nchar(10), 
    @ColName nvarchar(20),   
    @StartIndex int, 
    @PageSize int, 
    @RecordCount int output 
AS 
BEGIN 
    SET NOCOUNT ON; 

    DECLARE @Query nvarchar(MAX), 
      @Params nvarchar(MAX) 

    SET @StartIndex = (@PageSize * (@StartIndex-1))+1 
    SET @PageSize = @StartIndex + @PageSize - 1 

    SET @Params = '@StartIndex int, 
       @PageSize int, 
       @RecordCount int' 

    SET @Query = 'WITH TBL AS 
       (
       SELECT OD.OrderID,OD.ProductID,P.ProductName,OD.UnitPrice, 
       OD.Quantity,OD.Discount 
       FROM [Order Details] OD 
       LEFT JOIN Products P ON OD.ProductID = P.ProductID 
       ) 

       SELECT @RecordCount = COUNT(*) FROM TBL ; 

       SELECT * FROM 
       (
       SELECT ROW_NUMBER() OVER(ORDER BY '[email protected]+')Row, * 
       FROM TBL 
       )TEMP 
       WHERE Row BETWEEN @StartIndex AND @PageSize 
       ORDER BY Row '[email protected] 

    execute sp_Executesql @Query,@Params,@RecordCount,@StartIndex,@PageSize 
END 

ответ

1

Вы используете Common Table Expression имени TBL, который availaible до следующего оператора SQL из его определения и теряется в дальнейшем изложении SQL.

Поскольку вы уже использовали TBL раз в

SELECT @RecordCount = COUNT(*) FROM TBL ; 

он теперь потерял и не availaible впоследствии в следующем операторе SQL из динамического запроса и выдает сообщение об ошибке: Invalid Object named TBL

SELECT * FROM 
       (
       SELECT ROW_NUMBER() OVER(ORDER BY '[email protected]+')Row, * 
       FROM TBL 
       )TEMP 
       WHERE Row BETWEEN @StartIndex AND @PageSize 

Вы можете попробовать это

SET @Query = ';WITH TBL AS 
       (
       SELECT OD.OrderID,OD.ProductID,P.ProductName,OD.UnitPrice, 
       OD.Quantity,OD.Discount 
       FROM [Order Details] OD 
       LEFT JOIN Products P ON OD.ProductID = P.ProductID 
       ) 

       --SELECT @RecordCount = COUNT(*) FROM TBL ; Remove this statement 

       SELECT * FROM 
       (
       SELECT ROW_NUMBER() OVER(ORDER BY '[email protected]+')Row, 
         @RecordCount = COUNT(*) , * 
       FROM TBL 
       )TEMP 
       WHERE Row BETWEEN @StartIndex AND @PageSize 
       ORDER BY Row '[email protected] 
+0

Неправильный синтаксис рядом с '=' .. Кроме того, он все еще является параметром o/p param? – Ruby

1

Вы можете использовать переменную таблицы, а не CTE, таким образом вы можете подсчитать, а затем выбрать, как вы сочтете нужным. Если вы сделаете это, вы должны исправить выполнить вызов:

execute sp_Executesql 
    @Query, 
    @Params, 
    @StartIndex, 
    @PageSize, 
    @RecordCount OUTPUT 

как заказ в настоящее время неправильно и отсутствующих в OUTPUT.

В качестве альтернативы вы можете удалить выходной параметр и вернуть общее количество в качестве столбца во втором выборе;

SELECT * FROM 
(
    SELECT ROW_NUMBER() OVER(ORDER BY '[email protected]+') Row 
    , * 
    , COUNT(*) OVER() AS TOTAL_ROWS 
Смежные вопросы