![](/img/trans.png)
[英]Calling MySQL stored procedure / query from SQL Server stored procedure
[英]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'
您必須在存儲過程中聲明一個必須傳遞以運行存儲過程的變量。 這是一個例子。 請記住:在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.