代码之家  ›  专栏  ›  技术社区  ›  Spooks

T-SQL创建动态where语句?

  •  3
  • Spooks  · 技术社区  · 15 年前

    我知道这是不可能的,但有什么可以工作吗?基本上,我希望where语句是动态的,允许我传递任何字符串,它将能够搜索。

    Declare @search varchar(80)
    set @search = 'RegionID'
    
    Select * from TBL_TripDetails
    Where @search = '1'
    

    谢谢你的回答。在阅读了一些文档之后,我决定使用多个select语句,而不是使用动态sql。谢谢!

    5 回复  |  直到 15 年前
        1
  •  5
  •   Remus Rusanu    15 年前
    declare @sql nvarchar(max);
    set @sql = N'select * from table where ' + quotename(@search) + N'=''1''';
    exec sp_executesql @sql;
    

    看到了吗 The Curse and Blessings of Dynamic SQL

        2
  •  2
  •   StuartLC    15 年前

    看一看 sp_executesql

        3
  •  1
  •   heisenberg    15 年前
    Declare @search varchar(80)
    set @search = 'RegionID'
    
    declare @query varchar(max)
    set @query = "Select * from TBL_TripDetails Where " + @search + " = '1'"
    exec @query
    
        4
  •  1
  •   Jeff Hornby    15 年前
    DECLARE @search VARCHAR(80)
    DECLARE @SQL VARCHAR(8000)
    
    SET @search = 'RegionID'
    
    SET @SQL = 'SELECT * FROM TBL_TripDetails WHERE ' + @search + ' = 1'
    EXEC @SQL
    

        5
  •  1
  •   Zachary    15 年前

    我有点搞不懂你的问题“传递任何字符串,它将能够搜索”。在您的示例中,您传入的字段与硬编码值1进行比较,这与您的描述并不匹配。

    如果这是您真正想要的,那么您将需要使用动态SQL。如果您只想支持可选的搜索条件/参数(例如,如果RegionID设置了一个值,则应用条件,否则忽略条件),则使用下面的示例。

    DECLARE @RegionID AS VARCHAR(1);
    
    SELECT * 
    FROM TABLE
    WHERE (@RegionID Is Null OR @RegionID = '' OR RegionID = @RegionID);
    

    现在,如果@RegionID为空或NULL,则不会在条件中使用它。