2009-11-04 120 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

我認爲最好使用視圖或表值函數而不是建議的方法。兩者都允許你傳遞參數到函數

相關問題