Joa*_*kim 41 sql sql-server stored-procedures sql-server-2008
SELECT col1,
col2,
col3,
EXEC GetAIntFromStoredProc(T.col1) AS col4
FROM Tbl AS T
WHERE (col2 = @parm)
Run Code Online (Sandbox Code Playgroud)
如何在SQL Server 2008中编写此SQL查询?
Joa*_*kim 41
谢谢@twoleggedhorse.
这是解决方案.
首先我们创建了一个函数
CREATE FUNCTION GetAIntFromStoredProc(@parm Nvarchar(50)) RETURNS INTEGER
AS
BEGIN
DECLARE @id INTEGER
set @id= (select TOP(1) id From tbl where col=@parm)
RETURN @id
END
Run Code Online (Sandbox Code Playgroud)然后我们做选择查询
Select col1, col2, col3,
GetAIntFromStoredProc(T.col1) As col4
From Tbl as T
Where col2=@parm
Run Code Online (Sandbox Code Playgroud)Buv*_*inJ 32
函数很容易在select循环中调用,但它们不允许您运行插入,更新,删除等.它们仅对查询操作有用.您需要一个存储过程来操作数据.
因此,这个问题的真正答案是你必须通过"游标"迭代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;
Run Code Online (Sandbox Code Playgroud)
请注意,这@@FETCH_STATUS是一个为您更新的标准变量.这里的其余对象名称是自定义的.
只要您不在存储过程中执行任何INSERT或UPDATE语句,您就可能希望使其成为函数。
存储过程是由外部程序执行的,或者是按一定时间间隔执行的。
这里的答案将比我能更好地解释它:
您可以创建一个与您的 proc 输出匹配的临时表并插入其中。
CREATE TABLE #Temp (
Col1 INT
)
INSERT INTO #Temp
EXEC MyProc
Run Code Online (Sandbox Code Playgroud)