假设我有一个简单的存储过程:
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...
答案 0 :(得分: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 :(得分:3)
SQL Server允许您使用INSERT INTO来获取存储过程输出。例如,用PID<来获取所有进程。 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
答案 2 :(得分:1)
您不能将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'
答案 3 :(得分:1)
答案 4 :(得分:1)
您必须在存储过程中声明一个必须传递以运行存储过程的变量。这是一个例子。记住这一点:在AS
之前,您可以使用@
字符简单地声明任何变量,但在AS
之后您必须编写Declare
来声明任何变量,例如, Declare @name nvarchar (50)
。
ALTER PROCEDURE [dbo].[myProc]
@name varchar (50)
AS
BEGIN
SELECT * FROM myTable
where name= @name
END
答案 5 :(得分:1)
我认为使用视图或表值函数而不是建议的方法更好。两者都允许您将参数传递给函数
答案 6 :(得分:0)
如果你希望WHERE子句可以“关闭”,你可以这样做,如果要绕过WHERE限制,则传入一个预定的值(例如-1):
ALTER PROCEDURE [dbo].[myProc]
@X VARCHAR(10)
AS
BEGIN
SELECT * FROM myTable WHERE x=@X or @X = -1
END
GO