Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.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 从存储过程中选择列?_Sql_Sql Server_Sql Server 2008 - Fatal编程技术网

Sql 从存储过程中选择列?

Sql 从存储过程中选择列?,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我有一个存储的进程,我正在尝试从中选择所有行 SELECT * FROM dbo.SEL_My_Func 'arg1','arg2','ar3' 没用。所以我也试着: SELECT * FROM EXEC dbo.SEL_My_Func 'arg1','arg2','ar3' 但这也不起作用。如何测试存储的proc返回的结果是否正确 我不得不使用proc,而不是函数,因为我有一个ORDER BY作为SQL的一部分,请参见: 最后,我认为限制从存储的probc返回哪些列没有问题,您只是不能指定

我有一个存储的进程,我正在尝试从中选择所有行

SELECT * FROM dbo.SEL_My_Func 'arg1','arg2','ar3'
没用。所以我也试着:

SELECT * FROM EXEC dbo.SEL_My_Func 'arg1','arg2','ar3'
但这也不起作用。如何测试存储的proc返回的结果是否正确

我不得不使用proc,而不是函数,因为我有一个ORDER BY作为SQL的一部分,请参见:


最后,我认为限制从存储的probc返回哪些列没有问题,您只是不能指定哪些行(否则您最好使用SQL函数)?

您使用的解决方案将不起作用:

有变通办法

SELECT a.[1], a.[2]
FROM OPENROWSET('SQLOLEDB','myserver';'sa';'mysapass',
    'exec mydatabase.dbo.sp_onetwothree') AS a
或者将任务分成两个查询

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

SELECT col1, col2 FROM @tablevar

您正在使用的解决方案将不起作用:

有变通办法

SELECT a.[1], a.[2]
FROM OPENROWSET('SQLOLEDB','myserver';'sa';'mysapass',
    'exec mydatabase.dbo.sp_onetwothree') AS a
或者将任务分成两个查询

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

SELECT col1, col2 FROM @tablevar

你对函数的假设是错误的。您可以使用分区函数来选择组中的第一行

以下是查找每个客户的第一个经销商id的示例:

select client, dealer_id
from (
     select client, dealer_guid
         , RANK() over ( partition by client order by dealer_id) as rnk
     from Dealers
) cd where rnk = 1

这也可以通过函数调用和表(我的示例)来实现。

您对函数的假设是不正确的。您可以使用分区函数来选择组中的第一行

以下是查找每个客户的第一个经销商id的示例:

select client, dealer_id
from (
     select client, dealer_guid
         , RANK() over ( partition by client order by dealer_id) as rnk
     from Dealers
) cd where rnk = 1

这也可以通过函数调用和表(我的示例)来完成。

谢谢。这是否意味着我不能只选择要返回的proc列的子集?请参阅Romil的解决方案,或者谢谢。这是否意味着我不能只选择要返回的proc列的子集?请参阅Romil的解决方案,或者您不能在另一个语句中组合存储proc的输出-您不能限制生成哪些列和行-除非将整个输出转储到临时表中,然后
SELECT
ing从那里开始-但是你需要将
ORDER BY
应用到
SELECT
你不能在另一个语句中组合存储过程的输出-你不能限制生成哪些列和行-除非将整个输出转储到临时表中,然后从那里
选择
ing-但是你需要将
ORDER BY
应用于
选择
但是,OP将其代码放在存储过程中的全部原因是,他们可以指定
ORDER BY
。第二个显然不能保证在最终输出中尊重存储过程返回的行的顺序。“我认为第一个也不是。”达米恩,订单不是正常意义上的。存储的过程返回一组未排序的结果。然而,这些结果已经在一个列中被排序了(可能你最好看到我在顶部包含的链接)@Damien_不信者,OP可以使用order by子句和我在帖子中展示的方法。然而,OP将代码放在存储过程中的全部原因是,他们可以通过指定
顺序。第二个显然不能保证在最终输出中尊重存储过程返回的行的顺序。“我认为第一个也不是。”达米恩,订单不是正常意义上的。存储的过程返回一组未排序的结果。然而,这些结果已经在一个列上被排序了,该列被分组为@Damien_the_unsiever,OP可以使用order by子句和我在帖子中展示的方法。