SQL where子句中的转换错误


Conversion error in SQL where clause

在ODBC数据库表中,我有一个名为pSDateTime的列,它具有smalldatetime格式。

我在一个基于PHP的网站上运行一个搜索表单,有一个下拉菜单,你可以选择2015年,2014年,2013年等

当我提交搜索时得到这个错误:

Warning: odbc_exec(): SQL error: [Microsoft][ODBC SQL Server . xmlDriver][SQL Server]转换varchar值时,转换失败'%2014%'到数据类型int。

查询SQL状态

这是我运行的查询:

$query = "SELECT *
            FROM tbspeakers s join tbpresentations p on
            s.spkrId = p.spkrId
            join tbsessions ss on
            p.courseSessionid = ss.courseSessionId
            join tbcourses c on
            ss.courseId = c.courseId
            WHERE 
            (fname LIKE '%$searchq%' OR lname LIKE '%$searchq%' OR pTitle LIKE '%$searchq%' AND Year(pSDateTime) = '%$yearq%')
            ORDER BY pSDateTime DESC";

我已经尝试了不同类型的转换,并不断得到相同的错误。当我在Microsoft SQL Server Management Studio上运行查询时,它工作得很好。我就是没法把"%$yearq%"的格式转换出来。

YEAR()返回一个整数。这会导致等式的问题,因为另一个参数会被转换。这会产生一个错误。

两个选择:

Year(pSDateTime) = $yearq

或:

datename(year, psDateTime) = '$yearq'

您可能不希望对=使用通配符%。这些只适用于LIKE

您还应该弄清楚如何将查询中的值参数化。这使得它更安全(防止SQL注入)并且通常更快(通过消除每次执行代码时的重新编译)。