我有一个存储过程,它返回80列和300行。我要写一个select函数,它能得到2个这样的列。类似的
SELECT col1, col2 FROM EXEC MyStoredProc 'param1', 'param2'
当我使用上面的语法时,我得到了错误:
“无效的列名”。
我知道最简单的解决方案是更改存储过程,但我没有编写它,也不能更改它。
有什么办法能让我如愿以偿吗?
I could make a temp table to put the results in, but because there are 80 columns so I would need to make an 80 column temp table just to get 2 columns. I wanted to avoid tracking down all the columns that are returned.
I tried using WITH SprocResults AS .... as suggested by Mark, but I got 2 errors
Incorrect syntax near the keyword 'EXEC'.Incorrect syntax near ')'.
I tried declaring a table variable and I got the following error
Insert Error: Column name or number of supplied values does not match table definition
If I try
SELECT * FROM EXEC MyStoredProc 'param1', 'param2'
I get the error :
Incorrect syntax near the keyword 'exec'.
如果您这样做是为了手动验证数据,您可以使用LINQPad。
在LinqPad中创建一个到数据库的连接,然后创建类似于下面的c#语句:
DataTable table = MyStoredProc (param1, param2).Tables[0];
(from row in table.AsEnumerable()
select new
{
Col1 = row.Field<string>("col1"),
Col2 = row.Field<string>("col2"),
}).Dump();
参考http://www.global-webnet.net/blogengine/post/2008/09/10/LINQPAD-Using-Stored-Procedures-Accessing-a-DataSet.aspx
正如问题中提到的,在执行存储过程之前很难定义80列的临时表。
另一种方法是根据存储过程结果集填充表。
SELECT * INTO #temp FROM OPENROWSET('SQLNCLI', 'Server=localhost;Trusted_Connection=yes;'
,'EXEC MyStoredProc')
如果您得到任何错误,您需要通过执行以下查询来启用特定的分布式查询。
sp_configure 'Show Advanced Options', 1
GO
RECONFIGURE
GO
sp_configure 'Ad Hoc Distributed Queries', 1
GO
RECONFIGURE
GO
要使用两个参数执行sp_configure以更改配置选项或运行RECONFIGURE语句,必须授予ALTER SETTINGS服务器级权限
现在可以从生成的表中选择特定的列
SELECT col1, col2
FROM #temp
要实现这一点,首先你创建一个#test_table,如下所示:
create table #test_table(
col1 int,
col2 int,
.
.
.
col80 int
)
现在执行过程并将值放在#test_table中:
insert into #test_table
EXEC MyStoredProc 'param1', 'param2'
现在你从#test_table中获取值:
select col1,col2....,col80 from #test_table