如何从SQL Server中的存储过程查询?

时间:2009-11-04 21:10:31

标签: sql sql-server

假设我有一个简单的存储过程:

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

如何在Microsoft SQL Server Management Studio中对存储过程执行WHERE语句?这样的事情:

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

7 个答案:

答案 0 :(得分: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 :(得分:3)

SQL Server允许您使用INSERT INTO来获取存储过程输出。例如,用PID<来获取所有进程。 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

答案 2 :(得分:1)

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

您应该将该子句放在sproc中,如下所示:

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

调用存储过程的语法是使用EXECUTE而不是SELECT(例如):

EXECUTE dbo.myProc 'a'

答案 3 :(得分:1)

我认为你做不到。

执行存储过程的命令是EXECUTE

请参阅EXECUTE用法的some more examples

答案 4 :(得分:1)

您必须在存储过程中声明一个必须传递以运行存储过程的变量。这是一个例子。记住这一点:在AS之前,您可以使用@字符简单地声明任何变量,但在AS之后您必须编写Declare来声明任何变量,例如, Declare @name nvarchar (50)

ALTER PROCEDURE [dbo].[myProc]

@name varchar (50)

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

答案 5 :(得分:1)

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

答案 6 :(得分:0)

如果你希望WHERE子句可以“关闭”,你可以这样做,如果要绕过WHERE限制,则传入一个预定的值(例如-1):

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

BEGIN
    SELECT * FROM myTable WHERE x=@X or @X = -1
END

GO