tsql - 从结果集的存储过程选择列

  显示原文与译文双语对照的内容

我有一个存储过程,返回 80列和 300行。 我想写一个可以获得 2列的选择。 类似


SELECT col1, col2 FROM EXEC MyStoredProc 'param1', 'param2'

当我使用上面的语法时,我得到了错误"无效的列名"。

我知道最简单的解决方案是更改存储过程,但我没有写它,而且我不能改变它。

有什么可以做的?

  • 我可以创建一个临时表来放置结果,但是因为有 80列所以我需要创建 80列临时表才能得到 2列。 我想避免跟踪所有返回的列。

  • 我试着使用 WITH SprocResults AS.. .. 就像Mark所建议的,但我有 2个错误

    关键字'exec'附近的语法错误。
    ') 附近语法不正确'。

  • 我尝试声明一个表变量,得到了如下错误

    插入错误:提供的值或者提供的值与表定义不匹配

  • 如果我尝试
    SELECT * FROM EXEC MyStoredProc 'param1', 'param2'
    我收到错误:

    关键字'exec'附近的语法错误。

时间:

你能把查询分开? 将存储的过程结果插入表变量或者临时表。 然后,从表变量中选择 2列。


Declare @tablevar table(col1,..
insert into @tablevar(col1,..) exec MyStoredProc 'param1', 'param2'

SELECT col1, col2 FROM @tablevar


CREATE TABLE #Result
(
 ID int, Name varchar(500), Revenue money
)
INSERT #Result EXEC RevenueByAdvertiser '1/1/10', '2/1/10'
SELECT * FROM #Result ORDER BY Name
DROP TABLE #Result

来源:
http://stevesmithblog.com/blog/select-from-a-stored-procedure/

( 假设 SQL Server )

使用T-SQL中存储过程的结果的唯一方法是使用 INSERT INTO.. . EXEC 语法。这使你可以选择插入临时表或者表变量,也可以从其中选择所需的数据。

快速 hack 将添加一个新的参数 '@Column_Name',并让调用函数定义要检索的列名。 在sproc的返回部分中,如果/安葬语句并只返回指定的列,或者返回指定的列,则返回全部。


CREATE PROCEDURE [dbo].[MySproc]
 @Column_Name AS VARCHAR(50)
AS
BEGIN
 IF (@Column_Name = 'ColumnName1')
 BEGIN
 SELECT @ColumnItem1 as 'ColumnName1'
 END
 ELSE
 BEGIN
 SELECT @ColumnItem1 as 'ColumnName1', @ColumnItem2 as 'ColumnName2', @ColumnItem3 as 'ColumnName3'
 END
END

如果你能够修改存储过程,你可以轻松地将需要的列数作为参数:


CREATE PROCEDURE sp_GetDiffDataExample
 @columnsStatement NVARCHAR(MAX) -- Needed columns
AS
BEGIN
 DECLARE @query NVARCHAR(MAX)
 SET @query = N'SELECT ' + @columnsStatement + N' INTO ##TempTable FROM dbo.TestTable'
 EXEC sp_executeSql @query
 SELECT * FROM ##TempTable
 DROP TABLE ##TempTable
END

在这种情况下,你不需要手动创建临时表- 它是自动创建的。 希望这有帮助

试试这个


use mydatabase
create procedure sp_onetwothree as
select 1 as '1', 2 as '2', 3 as '3'
go
SELECT a.[1], a.[2]
FROM OPENROWSET('SQLOLEDB','myserver';'sa';'mysapass',
 'exec mydatabase.dbo.sp_onetwothree') AS a
GO

...