Подтвердить что ты не робот

Как выполнить хранимую процедуру внутри запроса выбора

SELECT col1,
       col2,
       col3,

EXEC GetAIntFromStoredProc(T.col1) AS col4
     FROM Tbl AS T
     WHERE (col2 = @parm) 

Как написать этот SQL-запрос в SQL Server 2008?

4b9b3361

Ответ 1

Спасибо @twoleggedhorse.

Вот решение.

  • Сначала мы создали функцию

    CREATE FUNCTION GetAIntFromStoredProc(@parm Nvarchar(50)) RETURNS INTEGER
    
    AS
    BEGIN
       DECLARE @id INTEGER
    
       set @id= (select TOP(1) id From tbl where [email protected])
    
       RETURN @id
    END
    
  • то мы делаем запрос select

    Select col1, col2, col3,
    GetAIntFromStoredProc(T.col1) As col4
    From Tbl as T
    Where [email protected]
    

Ответ 2

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

Итак, реальный ответ на этот вопрос заключается в том, что вы должны перебирать результаты выражения select с помощью "курсора" и вызывать процедуру изнутри этого цикла. Вот пример:

DECLARE @myId int;
DECLARE @myName nvarchar(60);
DECLARE myCursor CURSOR FORWARD_ONLY FOR
    SELECT Id, Name FROM SomeTable;
OPEN myCursor;
FETCH NEXT FROM myCursor INTO @myId, @myName;
WHILE @@FETCH_STATUS = 0 BEGIN
    EXECUTE dbo.myCustomProcedure @myId, @myName;
    FETCH NEXT FROM myCursor INTO @myId, @myName;
END;
CLOSE myCursor;
DEALLOCATE myCursor;

Обратите внимание, что @@FETCH_STATUS - стандартная переменная, которая обновляется для вас. Остальные имена объектов здесь являются обычными.

Ответ 3

Пока вы не делаете никаких инструкций INSERT или UPDATE в своей хранимой процедуре, вы, вероятно, захотите сделать ее функцией.

Хранимые процедуры предназначены для выполнения внешней программой или по временному интервалу.

Ответы здесь объяснят это лучше, чем я могу:

Функция против хранимой процедуры в SQL Server

Ответ 4

Вы можете создать временную таблицу, соответствующую выводу вашей процедуры, и вставить в нее.

CREATE TABLE #Temp (
    Col1 INT
)

INSERT INTO #Temp
    EXEC MyProc