【问题标题】:How to write tsql search function with a variable or unknown amount of parameters?如何使用变量或未知数量的参数编写 tsql 搜索函数?
【发布时间】:2015-04-14 13:28:40
【问题描述】:

所以我正在尝试编写一个 t-sql 函数,该函数将在数据库中搜索某些字段,但前提是这些字段不为空。因此,在下面的查询中,我的 c# 调用将传入这些参数,但如果我不想传入其中一个参数或其中一个为空,我希望它仍然搜索,但只能通过“ t null(基本上从 where 子句中排除)。是否有捷径可寻?还是我必须对每种输入组合进行单独查询?

CREATE FUNCTION [dbo].[Search]
(
    @firstname VarChar(50),
    @lastname VarChar(80),
    @userId VarChar(50),
    @vehicle VarChar(50)
)
RETURNS @returntable TABLE
(
    firstname VarChar(50),
    lastname VarChar(80),
    userId VarChar(50),
    vehicle VarChar(50),
    passengers VarChar(50)
)
AS
BEGIN
    INSERT @returntable
    SELECT * FROM Drivers
    Where firstname = @firstname and lastname = @lastname and 
          userid = @userId and vehicle = @vehicle
RETURN
END

【问题讨论】:

标签: c# sql sql-server tsql


【解决方案1】:

你可以跳过null的过滤器

CREATE FUNCTION [dbo].[Search]
(   
    @firstname VarChar(50),
    @lastname VarChar(80),
    @userId VarChar(50),
    @vehicle VarChar(50)
)
RETURNS TABLE 
AS
RETURN 
(
    SELECT * FROM Drivers
    Where 
    (@firstname is null or firstname = @firstname)
    and (@lastname is null or lastname = @lastname)
    and (@userId is null or userid = @userId)
    and (@vehicle is null or vehicle = @vehicle)
)

【讨论】:

  • 你可以看看我上面引用的文章。这种方法效果很好,但如果处理不当,可能会导致一些严重的性能问题。
  • @SeanLange,这是我在项目中使用的一种方法。谢谢你的链接,我已经开始阅读了。
【解决方案2】:

这将允许忽略设置为 NULL 的参数。

CREATE FUNCTION [dbo].[Search]
(
    @firstname VarChar(50),
    @lastname VarChar(80),
    @userId VarChar(50),
    @vehicle VarChar(50)
)
RETURNS @returntable TABLE
(
    firstname VarChar(50),
    lastname VarChar(80),
    userId VarChar(50),
    vehicle VarChar(50),
    passengers VarChar(50)
)
AS
BEGIN
    INSERT @returntable
    SELECT * FROM Drivers
    Where (@firstname IS NULL OR firstname = @firstname) AND 
          (@lastname IS NULL OR lastname = @lastname) AND  
          (@userId IS NULL OR userid = @userId) AND 
          (@vehicle IS NULL OR vehicle = @vehicle)
RETURN
END

【讨论】:

  • 太棒了!我希望有这样简单的东西,谢谢你的帮助!
  • 如果将其转换为内联表值函数会更合适。它的编写方式不必要地比它需要的慢。
  • 我遇到了这个方法的问题,但是,当我尝试使用 SqlDataAdapter (c#) 调用它时。似乎不喜欢我传递函数 null 值并导致抛出异常,就好像缺少参数一样......
  • 调用函数时是否命名参数?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多