Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何在select查询中执行存储过程_Sql_Sql Server_Sql Server 2008_Stored Procedures - Fatal编程技术网

Sql 如何在select查询中执行存储过程

Sql 如何在select查询中执行存储过程,sql,sql-server,sql-server-2008,stored-procedures,Sql,Sql Server,Sql Server 2008,Stored Procedures,如何在SQL Server 2008中编写此SQL查询?只要不在存储过程中执行任何INSERT或UPDATE语句,您可能会希望将其变成函数 存储过程用于由外部程序执行,或按定时间隔执行 这里的答案比我能解释得更好: 谢谢@Two-leggedhorse 这是解决办法 首先,我们创建了一个函数 SELECT col1, col2, col3, EXEC GetAIntFromStoredProc(T.col1) AS col4 FROM Tbl AS T

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

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

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

这里的答案比我能解释得更好:


谢谢@Two-leggedhorse

这是解决办法

首先,我们创建了一个函数

SELECT col1,
       col2,
       col3,

EXEC GetAIntFromStoredProc(T.col1) AS col4
     FROM Tbl AS T
     WHERE (col2 = @parm) 
然后我们执行select查询

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循环中调用,但它们不允许您运行INSERT、updates、DELETE等操作。它们只对查询操作有用。您需要一个存储过程来操作数据

所以,这个问题的真正答案是,您必须通过游标遍历select语句的结果,并从该循环中调用该过程。下面是一个例子:

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

请注意@@FETCH\u STATUS是一个标准变量,它会为您更新。此处的其余对象名称是自定义的。

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

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;
创建一个动态视图并从中获取结果

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

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

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
使用参数设置sp的值和exec命令

declare @sql nvarchar(4000)=''

您应该查看函数,不能从select查询中调用存储过程。请从tbl as t中选择col1、col2、col3、EXEC GetAIntFromStoredProct.col1作为col4,其中col2=@parm不是select col1,col2来自EXEC MyStoredProc的“param1”、“param2”。这不是一个重复,试图编辑,但被拒绝,在这篇文章的答案是正确的。正确的答案本来是不可能的。这不是关于程序的字面问题的答案。这是一个具有巨大局限性的替代解决方案。看看我的实际答案。这怎么能解决您刚才将存储过程转换为函数的问题呢?:如果存储过程要执行动态查询怎么办?存储过程可以由外部程序执行,也可以按一定的时间间隔执行,但它们并不局限于此,也不限于此。脚本一直都是在独立的、按需的上下文中运行的,用于数据操作。我认为使用游标不是这里的重点,并且扼杀了使用SELECT的全部意义。在我的情况下,我需要游标,因为我需要视图中的动态列,并且我从其他用户映射表中获得它。
declare @sql nvarchar(4000)=''
SET @sql += ' Exec spName @param'
EXECUTE sp_executesql @sql,  N'@param type', @param = @param