Переменные динамической таблицы SQL Server и возвращаемые переменные полей из этих таблиц

Я изо всех сил пытаюсь заставить эту логику работать в моей хранимой процедуре. Моя логика проста. У меня есть две хранимые процедуры, вызванные в другой хранимой процедуре (см. Код ниже).

Идея состоит в том, чтобы вернуть переменную даты или количество записей на основе предоставленного ввода и заполнить значения в основных переменных хранимых процедур.

Процедуры работают нормально, но я сталкиваюсь со следующими проблемами:

  • dbo.GetLastDate не возвращает значение даты

  • dbo.usr_GetRecCount всегда возвращает 0, даже если в таблице есть записи

Основная хранимая процедура:

    ....
                Exec dbo.usr_GetLastDate @TableName, @LastTransDate
                EXEC dbo.usr_GetRecCount @TableName, @RecCount
    ...

dbo.usr_GetLastDate:

   ALTER PROCEDURE [dbo].[usr_GetLastDate]
    -- Add the parameters for the stored procedure here
    @TableName SYSNAME,
    @OUTDATE date Output
AS
BEGIN
    SET NOCOUNT ON;

   DECLARE @SQLCommand NVARCHAR(MAX) = 
        N'SELECT @OUTDATE=MAX(TRANSDATE) FROM ' + QUOTENAME(@TableName);

  EXECUTE [dbo].[sp_executesql] 
             @sqlCommand, N'@OUTDATE DATE OUTPUT', @OUTDATE=@OUTDATE OUTPUT;

END

`dbo.usr_GetRecCount`:

   ALTER PROCEDURE [dbo].[usr_GetRecCount]
    -- Add the parameters for the stored procedure here
    @ViewName SYSNAME,
    @OUTINT int output
AS
BEGIN

    SET NOCOUNT ON;

   DECLARE @SQLCommand NVARCHAR(MAX) = 
        N'SELECT @OUTINT=COUNT(SYMBOL) FROM ' + QUOTENAME(@ViewName);


   EXECUTE [dbo].[sp_executesql] 
             @sqlCommand, N'@OUTINT INT OUTPUT', @OUTINT=@OUTINT OUTPUT;
END

3 ответа

Использование sp_executesql с явным OUTPUT параметр:

DECLARE @SQLCommand NVARCHAR(MAX) = 
            N'SELECT @OUTDATE = MAX(TRANSDATE) FROM ' + QUOTENAME(@TableName);

DECLARE @OUTDATE DATE;

EXECUTE sp_executesql @sqlCommand,
        N'@OUTDATE DATE OUTPUT',
        @OUTDATE=@OUTDATE OUTPUT;

Аналогичная структура должна быть использована и для второго запроса.

Спасибо за вашу помощь. После добавления исправлений, предложенных некоторыми из вас, это последний код, который работал

** Main Procedure **
Exec dbo.usr_GetLastDate @TableName, @LastTransDate OUTPUT
EXEC dbo.usr_GetRecCount @TableName, @RecCount OUTPUT

ALTER PROCEDURE [dbo].[usr_GetLastDate]
    -- Add the parameters for the stored procedure here
    @TableName SYSNAME,
    @OUTDATE date Output
    --<@Param2, sysname, @p2> <Datatype_For_Param2, , int> = <Default_Value_For_Param2, , 0>
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- Insert statements for procedure here
   DECLARE @SQLCommand NVARCHAR(MAX) = 
        N'SELECT @OUTDATE=MAX(TRANSDATE) FROM ' + QUOTENAME(@TableName);

   EXECUTE [dbo].[sp_executesql] 
             @sqlCommand, N'@OUTDATE DATE OUTPUT', @OUTDATE=@OUTDATE OUTPUT;

END

ALTER PROCEDURE [dbo].[usr_GetRecCount]
    -- Add the parameters for the stored procedure here
    @TableName SYSNAME,
    @OUTINT int output
    --<@Param2, sysname, @p2> <Datatype_For_Param2, , int> = <Default_Value_For_Param2, , 0>
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- Insert statements for procedure here
   DECLARE @SQLCommand NVARCHAR(MAX) = 
        N'SELECT @OUTINT=COUNT(SYMBOL) FROM ' + QUOTENAME(@TableName);


   EXECUTE [dbo].[sp_executesql] 
             @sqlCommand, N'@OUTINT INT OUTPUT', @OUTINT=@OUTINT OUTPUT;
END

Вам нужно объявить и передать эту переменную как OUTPUT, чтобы получить значение из оператора sql.

DECLARE @SQL NVARCHAR(MAX), @Value DATE;

 SET @SQL =  N'SELECT @Value = MAX(TRANSDATE) FROM ' + QUOTENAME(@TableName);

EXECUTE [dbo].[sp_executesql] @SQL
                             ,N'@Value Date OUTPUT'
                             ,@Value OUTPUT

SELECT @Value AS RtnValue
Другие вопросы по тегам