【问题标题】:Parametrise where clause in SQL Server 2008 R2SQL Server 2008 R2 中的参数 where 子句
【发布时间】:2014-04-07 05:36:20
【问题描述】:

我想从 C# 传递存储过程 where 子句的参数。我已经声明了一个参数@WhereClause nvarchar(max) 并且在查询中我给出了这样的

select distinct
    CLFIIK.AdID
    ,CLFIIK.AdGiverName
    ,CLFIIK.AdGiverEmail
    ,CLFIIK.Title
    ,left(CLFIIK.Descripton,200) +'...' as Descripton -- select 200 Caharacter and after 200 char it will add ...
    , case
          when CLFIIK.type = 1 then -- Wanted Events
            'Wanted Event'
          when  CLFIIK.type = 1 then -- offering Events
            'Offering Event'
          else -- Neither Wanted no Offering Events 
               'No Event Yet'
        end as Type 
         ,CASE
           WHEN DATEDIFF(HOUR, PublishedDate, GETDATE()) < 24 THEN 
               CASE DATEDIFF(HOUR, PublishedDate, GETDATE()) 
                   WHEN 1 THEN 
                      CONVERT(VARCHAR, DATEDIFF(HOUR, PublishedDate, GETDATE())) + ' hour ago' 
                   ELSE 
                      CONVERT(VARCHAR, DATEDIFF(HOUR, PublishedDate, GETDATE())) + ' hours ago'
               END
          ELSE 
         REPLACE(CONVERT(VARCHAR, PublishedDate, 6), ' ', '-')  
       END as PublishedDate
       ,CLFIIK.LastModifiedDate
       ,LM.LocalityName +', '+ CityM.CityName as Address
       ,CM.CategoryName
       ,CM.CategoryID
 from 
     CLF.utblCLFAdInstanceInfoKeys as CLFIIK
 inner join
     dbo.utblCategoryMaster as  CM on CM.CategoryID = CLFIIK.CategoryID
 inner join 
     dbo.utblLocalityMaster as LM on LM.LocalityID = CLFIIK.LocalityID
 inner join 
     dbo.utblCityMaster as CityM on CityM.CityID = LM.CityID
 left join 
     CLF.utblCLFAdInstanceDtls as AdInsDeets on AdInsDeets.AdID = CLFIIK.AdID
 where  
     @WhereClause;

SQL Server 2008 R2 抛出此错误

消息 4145,级别 15,状态 1,过程 udspGetCLFSearchResultEventList,第 55 行
在预期条件的上下文中指定的非布尔类型的表达式,靠近 ';'。

我该如何解决这个错误?

【问题讨论】:

  • 这是 where 子句的语法:technet.microsoft.com/en-us/library/… 为了在语法上正确,您的变量应该是布尔值,但这不会达到您想要的效果。正确的方法是对搜索谓词的特定部分进行参数化,或者将存储过程转换为视图,然后在前端使用实体框架之类的东西为您创建正确的 sql。
  • 最好描述一下为什么要将where子句作为文本传递,可能会有更好的解决方案。如果不是,那么您可以从变量构造一个字符串查询,然后使用 EXECUTE technet.microsoft.com/en-us/library/… 执行它,但我建议不要这样做
  • 我不能将 nvarchar 转换为布尔值,以便获得预期的输出
  • 实际上我想在我的网站上进行分面搜索。这就是我想在 C# 中设置参数并通过的唯一原因
  • 我没有分面搜索的经验,但显然relational databases cannot implement faceting efficiently

标签: sql-server sql-server-2008-r2 where-clause


【解决方案1】:

虽然这确实可行...

DECLARE @sql nvarchar(2000) = 'SELECT ....  FROM ....'
DECLARE @sqlwithwhere nvarchar(2000)
SET @sqlwithwhere = @sql + @WhereClause
EXEC sp_executesql @sqlwithwhere

...您真的应该在 C# 中声明存储过程参数并单独传递它们。像这样使用动态 SQL 存在 SQL 注入的风险。而且它更像是一种 hack,而不是标准方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-06
    • 2014-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多