manoj1412012 Ответов: 3

Как вернуть таблицу из процедуры хранения в SQL server.


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

Я хочу вернуть результат запроса в табличном формате.

поэтому, когда я пытаюсь использовать приведенный ниже код, я получаю get return 0 .

Что я уже пробовал:

ALTER PROCEDURE [dbo].[Sp_Create_employee]
	-- Add the parameters for the stored procedure here
	@employeename varchar(20), 
	@Isactive bit,
	@CreatedOn  datetime,
	@CreatedBy int
AS
BEGIN
	 DECLARE @tab table 
 (
 Employeeid int,
 employeename varchar(20),
 Isactive bit,
 CreatedOn datetime,
 CreatedBy int)

	SET NOCOUNT ON;

	 INSERT INTO [dbo].[Employee]
           ([employeename ]
           ,[Isactive]
           ,[CreatedOn]
           ,[CreatedBy])
     VALUES
           (@employeename,@Isactive,@CreatedOn,@CreatedBy)
   
   insert @tab SELECT [Employeeid],[employeename],[Isactive],[CreatedOn],[CreatedBy] FROM [PACTS ].[dbo].[Employee]    
   
    RETURN select * from @tab
	
  END

RedDk

Беглый взгляд на эту процедуру заставляет меня заподозрить, что это не MSSQL, а какая-то другая разновидность SQL. Как насчет добавления

 к этому посту с помощью виджета "Improve question", показывающего, как вы вызываете этот stoproc с учетом такого-то количества параметров?

3 Ответов

Рейтинг:
14

Richard Deeming

Цитата:
RETURN select * from @tab

Вот почему очень жаль, что T-SQL не предписывает точку с запятой завершать каждый оператор-слишком легко поместить два разных оператора в одну строку и предположить, что это один оператор.
RETURN [ integer_expression ]

Применяя необязательные Терминаторы операторов, ваш код становится:
RETURN;
select * from @tab;

Теперь должно быть очевидно, что это два отдельных утверждения. То RETURN завершает хранимую процедуру, и ничто из того, что следует за ней, не будет выполнено, включая SELECT заявление в следующей строке.

Предполагая, что вы используете SQL Server 2005 или более позднюю версию и вам нужны только сведения о вновь вставленной записи, предложение Output[^] вероятно, это был бы самый простой вариант:
ALTER PROCEDURE [dbo].[Sp_Create_employee]
    @employeename varchar(20), 
    @Isactive bit,
    @CreatedOn  datetime,
    @CreatedBy int
AS
BEGIN
    SET NOCOUNT ON;
    
    INSERT INTO [dbo].[Employee]
    (
        [employeename ],
        [Isactive],
        [CreatedOn],
        [CreatedBy]
    )
    OUTPUT
        inserted.[Employeeid],
        inserted.[employeename],
        inserted.[Isactive],
        inserted.[CreatedOn],
        inserted.[CreatedBy]
    VALUES
    (
        @employeename,
        @Isactive,
        @CreatedOn,
        @CreatedBy
    );
END

В противном случае, если вам нужны данные для всей таблицы, как показывает ваш вопрос, добавьте SELECT после INSERT. Но не ставьте RETURN прямо перед ним!


ZurdoDev

Может быть, я что-то упускаю, но зачем нужно выводить те же параметры, которые были введены в качестве входных данных?

Richard Deeming

Обычно, чтобы получить значение IDENTITY поле-обратите внимание, что EmployeeId не является параметром для этой процедуры.

Рейтинг:
11

Pawan Sharma Software Developer

Вам не нужно создавать табличную переменную для извлечения таблицы.

Ваш код должен выглядеть следующим образом:


ALTER PROCEDURE [dbo].[Sp_Create_employee]
	-- Add the parameters for the stored procedure here
	@employeename varchar(20), 
	@Isactive bit,
	@CreatedOn  datetime,
	@CreatedBy int
AS
BEGIN
	 
	SET NOCOUNT ON;
 
	 INSERT INTO [dbo].[Employee]
           ([employeename ]
           ,[Isactive]
           ,[CreatedOn]
           ,[CreatedBy])
     VALUES
           (@employeename,@Isactive,@CreatedOn,@CreatedBy)
   
   SELECT [Employeeid],[employeename],[Isactive],[CreatedOn],[CreatedBy] FROM [PACTS].[dbo].[Employee]

  END


Рейтинг:
1

ZurdoDev

1. Не используйте табличную переменную. По крайней мере, в вашем примере здесь нет никаких причин для этого, и это замедлит ваш процесс.
2.Не используйте RETURN. Просто напишите оператор select, а затем, когда вы выполните его из C#, это будет таблица.