2009-11-04 117 views
3

让说我有存储过程简单:如何从SQL Server中的存储过程进行查询?

ALTER PROCEDURE [dbo].[myProc] 
AS 
BEGIN 
    SELECT * FROM myTable 
END 

我怎样才能做一个WHERE语句在Microsoft SQL Server Management Studio中的存储过程?类似的东西:

SELECT * FROM myProc WHERE x = 'a'; -- But that doesn't work... 
+0

你继续使用这个词...我不认为这意味着你认为它的意思... – 2009-11-04 21:15:03

+2

@ B蜥蜴:你必须毁了它... – 2009-11-04 21:15:43

+0

我不明白吗?什么是错误的,我看不到我在哪里使用“我不会”。你在乎解释吗? – 2009-11-04 21:18:29

回答

8

它听起来像你正试图做一个“动态”的存储过程。你可能想要做

的东西是:

1)将您的存储过程中的内容到一个临时表

2)使用动态SQL的where条件适用于临时表。

喜欢的东西:

declare @as_condition varchar(500); --Your condition 

create table #a 
(
id bigint 
) 

insert into #a 
execute sproc 

declare @ls_sql varchar(max); 
set @ls_sql = "select * from #a where " + @as_condition; 
execute (@ls_sql); 
+1

不需要动态SQL select * from #a where x ='a'将工作得很好。 – HLGEM 2009-11-04 21:35:40

+0

只要确保使用完全相同的列来定义临时表,存储过程就会返回相同的数据类型。除非结构匹配,否则它将不起作用。 – HLGEM 2009-11-04 21:36:35

+0

我想@Hythloth的意思是插入你的存储过程的_results_,而不是_contents_。 – Suncat2000 2016-01-26 19:26:54

1

您不能添加WHERE子句到这样的存储过程。

你应该把子句中的存储过程,就像这样:

ALTER PROCEDURE [dbo].[myProc] 
    @X VARCHAR(10) 
AS 
BEGIN 
SELECT * FROM myTable WHERE [email protected] 
END 
GO 

的语法调用存储过程是通过使用EXECUTE不选择(例如):

EXECUTE dbo.myProc 'a' 
+0

我知道,但让我说我没有权利修改程序... – 2009-11-04 21:16:54

+1

然后,你必须执行存储过程作为Hythloth建议的临时表,然后在该临时表上运行限制性查询。虽然我真的不会使用动态SQL,除非你真的,真的必须 – AdaTheDev 2009-11-04 21:20:58

0

如果你想在WHERE子句是一些你可以“关闭”你能做到这一点,传递一个预定值(例如-1)如果WHERE限制被绕过:

ALTER PROCEDURE [dbo].[myProc]  
@X VARCHAR(10) 
AS 

BEGIN 
    SELECT * FROM myTable WHERE [email protected] or @X = -1 
END 

GO 
2

SQL Server允许您使用INSERT INTO来获取存储过程的输出。例如,要抓住与SPID < 10的所有进程,使用方法:

create table #sp_who (
    spid  smallint, 
    ecid  smallint, 
    status nchar(30), 
    loginame nchar(128), 
    hostname nchar(128), 
    blk  char(5), 
    dbname nchar(128), 
    cmd  nchar(16), 
    request int) 

insert into #sp_who execute sp_who 

select * from #sp_who where spid < 10 
1

您必须声明的存储过程中的变量,这将是必要的传递到运行存储过程。这是一个例子。请记住:在AS之前,您只需使用@字符声明任何变量,但在AS之后,您必须编写Declare声明任何变量,例如Declare @name nvarchar (50)

ALTER PROCEDURE [dbo].[myProc] 

@name varchar (50) 

AS 
BEGIN 
    SELECT * FROM myTable 
    where name= @name 
END 
+0

你的答案和上面2009年的人一样。 – 2014-11-04 22:29:54

1

我认为最好使用视图或表值函数而不是建议的方法。两者都允许你传递参数到函数

相关问题