0

对不起,如果我的标题很清楚。我正在尝试创建一个存储过程:

Create Procedure Pro1 @a nvarchar = null, @b nvarchar =null
as
Select * from table1
where Parameter1 = '1'
and Parameter2 = @a
go

上面不是实际的代码,但我希望它能解释我想要实现的目标。我正在选择两个参数。'Parameter2' 取决于变量@a。我面临的挑战是,如果@a 在执行时保持为空;我希望 select 语句搜索 Parmeter2 的所有值,就好像“and”语句不存在一样。我可以编写一个 if else 语句来执行不同的选择,但我希望我可以简单地将 @a 设置为某种可以简单地执行此操作的通配符值?也许是什么:'like []'?

4

1 回答 1

2
CREATE PROCEDURE dbo.Pro1 -- use schema prefix when creating objects!
  @a NVARCHAR(32) = NULL -- 32 should match data type of Parameter2 column
AS
BEGIN -- wrap your body and indent for readability
  SET NOCOUNT ON; -- should always turn off DONE_IN_PROC messages

  SELECT columns -- please name your columns instead of SELECT *
    FROM dbo.table1 -- use schema prefix when referencing objects
    WHERE (Parameter2 = @a OR @a IS NULL); -- semi-colons please!
END
GO

在某些情况下,您可能会发现,如果您有很多这些可选参数,SQL Server 将为一组参数编译一个计划,而该计划对于不同的参数并没有多大好处。所以你可能想要这样的东西:

CREATE PROCEDURE dbo.Pro1
  @a NVARCHAR(32) = NULL
AS
BEGIN
  SET NOCOUNT ON;

  DECLARE @sql NVARCHAR(MAX);

  SET @sql = N'SELECT columns FROM dbo.table1 WHERE 1=1';

  IF @a IS NOT NULL
    SET @sql += ' AND Parameter2 = @a';

  EXEC sp_executesql @sql,
    N'@a NVARCHAR(32)',
    @a;
END
GO
于 2013-07-18T15:25:54.160 回答