Переменные динамической таблицы 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