在SELECT命令中调用存储过程

时间:2016-09-01 12:31:45

标签: sql sql-server stored-procedures

我有一个存储过程ModifiedName,是否可以列出表中所有行的名称并在其旁边显示“已修改的名称”?

一些事情:

SELECT name, EXEC ModifiedName name
FROM table

但哪个会起作用......

3 个答案:

答案 0 :(得分:1)

首先,您必须编写函数而不是过程。你不能在select语句中调用一个过程,但函数可以。

在函数内部编写逻辑以修改名称并在选择查询中使用它。

例如,编写一个如下所示的函数。(这将附加'名字'先生'

CREATE FUNCTION  dbo.ModifiedName ( @name VARCHAR(50))
    RETURNS VARCHAR(150)
    AS
    BEGIN
     DECLARE @ModifiedName VARCHAR(150)
     SET @ModifiedName= 'Mr.'+@name
     RETURN @ModifiedName
    END

使用以下脚本在选择列表中获取原始名称和修改后的名称。

SELECT name, dbo.ModifiedName (name)
FROM table

答案 1 :(得分:0)

如果是parameterless sp,您可以使用临时表。否则,您应该使用function

CREATE TABLE #tmp (Name INT)
INSERT INTO #tmp
EXEC ModifiedName

SELECT name, (SELECT TOP 1 Name FROM #tmp) name
FROM table

答案 2 :(得分:0)

你可以做到

CREATE TABLE SomeName(... appropriate definitions ...);

INSERT INTO SomeName
EXEC YourSP;

SELECT * FROM SomeName;

但是 - 说实话 - 我认为你正在尝试以另一种方式解决的事情......

  • 创建一个功能
  • 尝试内联您的逻辑

更新这是@NEER

你好,不知道你对你的评论意味着什么,但试试这个:

CREATE PROCEDURE dbo.tmpTest AS
BEGIN
    SELECT TOP 3 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS
END
GO

CREATE TABLE #tmpTable(ColName NVARCHAR(MAX));

INSERT INTO #tmpTable
EXEC dbo.tmpTest;

SELECT * FROM #tmpTable;
GO

DECLARE @tmpTbl TABLE(ColName NVARCHAR(MAX));

INSERT INTO @tmpTbl
EXEC dbo.tmpTest;

SELECT * FROM @tmpTbl;
GO
DROP TABLE #tmpTable;
DROP PROCEDURE dbo.tmpTest;

但是 - 一般情况下 - 如果您只想读取数据,则应该使用VIEWinline TVF。程序设计某事......