SELECT col1,
col2,
col3,
EXEC GetAIntFromStoredProc(T.col1) AS col4
FROM Tbl AS T
WHERE (col2 = @parm)
Как написать этот SQL-запрос в SQL Server 2008?
SELECT col1,
col2,
col3,
EXEC GetAIntFromStoredProc(T.col1) AS col4
FROM Tbl AS T
WHERE (col2 = @parm)
Как написать этот SQL-запрос в SQL Server 2008?
Спасибо @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]
Функции легко вызывать внутри цикла выбора, но они не позволяют запускать вставки, обновления, удаления и т.д. Они полезны только для операций запроса. Вам нужна хранимая процедура для управления данными.
Итак, реальный ответ на этот вопрос заключается в том, что вы должны перебирать результаты выражения 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
- стандартная переменная, которая обновляется для вас. Остальные имена объектов здесь являются обычными.
Пока вы не делаете никаких инструкций INSERT или UPDATE в своей хранимой процедуре, вы, вероятно, захотите сделать ее функцией.
Хранимые процедуры предназначены для выполнения внешней программой или по временному интервалу.
Ответы здесь объяснят это лучше, чем я могу:
Вы можете создать временную таблицу, соответствующую выводу вашей процедуры, и вставить в нее.
CREATE TABLE #Temp (
Col1 INT
)
INSERT INTO #Temp
EXEC MyProc