代码之家  ›  专栏  ›  技术社区  ›  Patrick Desjardins

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

  •  3
  • Patrick Desjardins  · 技术社区  · 16 年前

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

    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 回复  |  直到 9 年前
        1
  •  8
  •   Hythloth    16 年前

    听起来好像您正在尝试创建一个“动态”存储过程。

    您可能想做的事情是:

    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);
    
        2
  •  3
  •   Andomar    16 年前

    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
    
        3
  •  1
  •   AdaTheDev    16 年前

    不能向这样的存储过程中添加WHERE子句。

    您应该将该子句放入存储过程中,如下所示:

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

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

    EXECUTE dbo.myProc 'a'
    
        4
  •  1
  •   honk    11 年前

    我想你不能那样做。

    执行存储过程的命令是 EXECUTE .

    some more examples 执行 用法。

        5
  •  1
  •   Syed Uzair Uddin    11 年前

    必须在存储过程中声明一个变量,该变量是运行存储过程所必需的。下面是一个例子。记住:之前 AS 您可以通过使用 @ 角色,但在 AS 你必须写 Declare 要声明任何变量,例如, Declare @name nvarchar (50) .

    ALTER PROCEDURE [dbo].[myProc]
    
    @name varchar (50)
    
    AS
    BEGIN
        SELECT * FROM myTable
        where name= @name
    END
    
        6
  •  1
  •   PBo    9 年前

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

        7
  •  0
  •   davek    16 年前

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

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