讓說我有存儲過程簡單:如何從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...
讓說我有存儲過程簡單:如何從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...
它聽起來像你正試圖做一個「動態」的存儲過程。你可能想要做
的東西是:
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 select * from #a where x ='a'將工作得很好。 – HLGEM 2009-11-04 21:35:40
只要確保使用完全相同的列來定義臨時表,存儲過程就會返回相同的數據類型。除非結構匹配,否則它將不起作用。 – HLGEM 2009-11-04 21:36:35
我想@Hythloth的意思是插入你的存儲過程的_results_,而不是_contents_。 – Suncat2000 2016-01-26 19:26:54
您不能添加WHERE子句到這樣的存儲過程。
你應該把子句中的存儲過程,就像這樣:
ALTER PROCEDURE [dbo].[myProc]
@X VARCHAR(10)
AS
BEGIN
SELECT * FROM myTable WHERE [email protected]
END
GO
的語法調用存儲過程是通過使用EXECUTE不選擇(例如):
EXECUTE dbo.myProc 'a'
我知道,但讓我說我沒有權利修改程序... – 2009-11-04 21:16:54
然後,你必須執行存儲過程作爲Hythloth建議的臨時表,然後在該臨時表上運行限制性查詢。雖然我真的不會使用動態SQL,除非你真的,真的必須 – AdaTheDev 2009-11-04 21:20:58
如果你想在WHERE子句是一些你可以「關閉」你能做到這一點,傳遞一個預定值(例如-1)如果WHERE限制被繞過:
ALTER PROCEDURE [dbo].[myProc]
@X VARCHAR(10)
AS
BEGIN
SELECT * FROM myTable WHERE [email protected] or @X = -1
END
GO
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
您必須聲明的存儲過程中的變量,這將是必要的傳遞到運行存儲過程。這是一個例子。請記住:在AS
之前,您只需使用@
字符聲明任何變量,但在AS
之後,您必須編寫Declare
聲明任何變量,例如Declare @name nvarchar (50)
。
ALTER PROCEDURE [dbo].[myProc]
@name varchar (50)
AS
BEGIN
SELECT * FROM myTable
where name= @name
END
你的答案和上面2009年的人一樣。 – 2014-11-04 22:29:54
我認爲最好使用視圖或表值函數而不是建議的方法。兩者都允許你傳遞參數到函數
你繼續使用這個詞...我不認爲這意味着你認爲它的意思... – 2009-11-04 21:15:03
@ B蜥蜴:你必須毀了它... – 2009-11-04 21:15:43
我不明白嗎?什麼是錯誤的,我看不到我在哪裏使用「我不會」。你在乎解釋嗎? – 2009-11-04 21:18:29