簡體   English   中英

如何從SQL Server中的存儲過程查詢?

[英]How to query from a stored procedure in 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...

聽起來你正試圖制作一個“動態”的存儲過程。

你可能想做的事情是:

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);

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

您不能將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'

我想你不能這樣做。

執行存儲過程的命令是EXECUTE

查看更多 EXECUTE用法示例

您必須在存儲過程中聲明一個必須傳遞以運行存儲過程的變量。 這是一個例子。 請記住:在AS之前,您可以使用@字符簡單地聲明任何變量,但在AS之后,您必須編寫Declare來聲明任何變量,例如, Declare @name nvarchar (50)

ALTER PROCEDURE [dbo].[myProc]

@name varchar (50)

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

我認為使用視圖或表值函數而不是建議的方法更好。 兩者都允許您將參數傳遞給函數

如果你希望WHERE子句是你可以“關閉”的東西,你可以這樣做,如果要繞過WHERE限制,傳入預定值(例如-1):

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

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

GO

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM