如何在选择查询中执行存储过程

问题描述 投票:0回答:9
SELECT col1,
       col2,
       col3,

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

如何在 SQL Server 2008 中编写此 SQL 查询?

sql sql-server sql-server-2008 stored-procedures
9个回答
64
投票

谢谢@twoleggedhorse。

这是解决方案。

  1. 首先我们创建了一个函数

    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
    
  2. 然后我们进行选择查询

    Select col1, col2, col3,
    GetAIntFromStoredProc(T.col1) As col4
    From Tbl as T
    Where col2=@parm
    

58
投票

函数很容易在 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;

请注意,

@@FETCH_STATUS
是一个标准变量,会为您更新。这里的其余对象名称是自定义的。


13
投票

您可以创建一个与您的过程输出匹配的临时表并将其插入其中。

CREATE TABLE #Temp (
    Col1 INT
)

INSERT INTO #Temp
    EXEC MyProc

7
投票

“不可能”。 您可以使用函数代替存储过程。


6
投票

只要您不在存储过程中执行任何 INSERT 或 UPDATE 语句,您可能希望将其设为函数。

存储过程用于由外部程序执行,或按时间间隔执行。

这里的答案会比我更好地解释它:

SQL Server 中的函数与存储过程


4
投票

“不可能”。您可以使用此查询来执行此操作。 在这里初始化

declare @sql nvarchar(4000)=''

使用参数设置 sp 的值并执行命令

SET @sql += ' Exec spName @param'
EXECUTE sp_executesql @sql,  N'@param type', @param = @param

1
投票

不要忘记,如果您只想使用 SP 作为一次性查询来快速检查某些内容,您所要做的就是将 SP 的内部结构拉出来并将其粘贴到新的查询窗口中并执行任何操作你喜欢那时,因为它不再是 SP。


0
投票

创建动态视图并从中获取结果......

CREATE PROCEDURE dbo.usp_userwise_columns_value
(
    @userid BIGINT
)
AS 
BEGIN
        DECLARE @maincmd NVARCHAR(max);
        DECLARE @columnlist NVARCHAR(max);
        DECLARE @columnname VARCHAR(150);
        DECLARE @nickname VARCHAR(50);

        SET @maincmd = '';
        SET @columnname = '';
        SET @columnlist = '';
        SET @nickname = '';

        DECLARE CUR_COLUMNLIST CURSOR FAST_FORWARD
        FOR
            SELECT columnname , nickname
            FROM dbo.v_userwise_columns 
            WHERE userid = @userid

        OPEN CUR_COLUMNLIST
        IF @@ERROR <> 0
            BEGIN
                ROLLBACK
                RETURN
            END   

        FETCH NEXT FROM CUR_COLUMNLIST
        INTO @columnname, @nickname

        WHILE @@FETCH_STATUS = 0
            BEGIN
                SET @columnlist = @columnlist + @columnname + ','

                FETCH NEXT FROM CUR_COLUMNLIST
                INTO @columnname, @nickname
            END
        CLOSE CUR_COLUMNLIST
        DEALLOCATE CUR_COLUMNLIST  

        IF NOT EXISTS (SELECT * FROM sys.views WHERE name = 'v_userwise_columns_value')
            BEGIN
                SET @maincmd = 'CREATE VIEW dbo.v_userwise_columns_value AS SELECT sjoid, CONVERT(BIGINT, ' + CONVERT(VARCHAR(10), @userid) + ') as userid , ' 
                            + CHAR(39) + @nickname + CHAR(39) + ' as nickname, ' 
                            + @columnlist + ' compcode FROM dbo.SJOTran '
            END
        ELSE
            BEGIN
                SET @maincmd = 'ALTER VIEW dbo.v_userwise_columns_value AS SELECT sjoid, CONVERT(BIGINT, ' + CONVERT(VARCHAR(10), @userid) + ') as userid , ' 
                            + CHAR(39) + @nickname + CHAR(39) + ' as nickname, ' 
                            + @columnlist + ' compcode FROM dbo.SJOTran '
            END

        EXECUTE sp_executesql @maincmd
END

-----------------------------------------------
SELECT * FROM dbo.v_userwise_columns_value

0
投票

首先,如果可以将存储过程编写为新函数,请编写一个像@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

然后我们进行选择查询

Select col1, col2, col3,
GetAIntFromStoredProc(T.col1) As col4
From Tbl as T
Where col2=@parm

如果必须使用存储过程,可以这样做:

  1. 使用表变量:如果存储过程有 1 行数据或顶部 (1) 行对于您的查询为 true,则可以像这样使用表变量:

    声明@tablevar table(col1 Int, col2 Int)

    插入 @tablevar(col1 ,col2 ) Exec GetAIntFromStoredProc @param1 ,@param2,@param3

-- 然后您可以从该表中选择数据,例如: select col1 from @tablevar

SELECT col1,
       col2,
       col3,
(select clo1 from @tablevar) AS col4--or (select top(1) clo1 from @tablevar) AS col4
     FROM Tbl AS T
     WHERE (col2 = @parm) 
  1. 使用临时表:

    如果 OBJECT_ID('#TmpTABLE','U')IS NOT NULL 删除表#TmpTABLE 创建表 #TmpTABLE (col1 INT,col2 INT) INSERT #TmpTABLE Exec GetAIntFromStoredProc @param1,@param2,@param3

    选择第 1 列, 第 2 列, 第 3 栏, (从 #TmpTABLE 中选择 clo1)AS col4 --或(从 @tablevar 中选择 top(1) clo1)AS col4 来自 Tbl AS T 哪里(col2 = @parm)

  2. 使用光标:

    声明@myId int; 声明 @myName nvarchar(60); DECLARE myCursor CURSOR FORWARD_ONLY FOR 从 SomeTable 中选择 ID、名称; 打开我的光标; 从 myCursor 获取下一个内容到 @myId、@myName; 当 @@FETCH_STATUS = 0 开始时 执行 dbo.myCustomProcedure @myId、@myName; 从 myCursor 获取下一个内容到 @myId、@myName; 结尾; 关闭我的光标; 解除分配我的光标;

© www.soinside.com 2019 - 2024. All rights reserved.