2013-08-28 42 views
0

我传递的URL两(2)参数,并建立以下SQL:ASP经典SQL查询错误信息,正确的语法请

mQry = "SELECT DISTINCT name FROM link3 WHERE invoice_num =" & request.querystring("num") & "AND name LIKE" & request.querystring("nam") 

我得到一个错误信息:

微软OLE DB提供程序的Oracle错误 '80040E14'

ORA-00933:SQL命令不能正确地结束

这将是什么正确的语法?

回答

4

你需要在LIKE子句中加引号。此外,您可以考虑使用百分比通配符匹配

mQry = "SELECT DISTINCT name FROM link3 WHERE invoice_num =" & request.querystring("num") & " AND name LIKE '%" & request.querystring("nam") & "%' " 
0

部分您的问题,可绕在那里你插入值引号的间距不当。这:

mQry = "SELECT DISTINCT name FROM link3 WHERE invoice_num =" & request.querystring("num") & "AND name LIKE" & request.querystring("nam") 

将最有可能导致发送此到数据库:

SELECT DISTINCT name 
FROM link3 
WHERE invoice_num =2AND name LIKEsomeothervalue 

如果添加适当的间距是这样的:

mQry = "SELECT DISTINCT name FROM link3 WHERE invoice_num = " & request.querystring("num") & " AND name LIKE " & request.querystring("nam") 

它会给你一个更正确格式化结果如下:

SELECT DISTINCT name 
FROM link3 
WHERE invoice_num = 2 AND name LIKE someothervalue 

任何时候我收到指示SQL格式化/结构问题的错误时,我倾向于记录发送到数据库之前发送的SQL。这有助于发现类似的奇怪问题。

此外,sharpguru is probably right - LIKE子句可能没有正确格式化。你需要用单引号文本值和%是匹配0或多个字符的通配符 - 使这更像是你可能寻找:

mQry = "SELECT DISTINCT name FROM link3 WHERE invoice_num = " & request.querystring("num") & " AND name LIKE '%" & request.querystring("nam") & "%'" 

现在,这样做的所有假设invoice_num是某种数值 - 这是隐含在您的问题和代码中。然而,如果不是(由您的评论和其他问题的建议),你就需要把值在单引号 - 就像任何其他的文本字段中几乎所有RDBMS:

mQry = "SELECT DISTINCT name FROM link3 WHERE invoice_num = '" & request.querystring("num") & "' AND name LIKE '%" & request.querystring("nam") & "%'" 

以上也将在数据库列invoice_num的数据类型被设置为非数字数据类型时使用。仅仅因为数据可能被称为数字,并不意味着它会被自动视为数字。如果列的数据类型是text,ntext或任何其他非数字类型,那么您将需要用引号将值包围,就像任何其他文本值一样。


而且,虽然没有涉及到这个问题,我希望这是一个过于简单化的例子,你不能直接插入查询字符串值到SQL语句。如果你还没有被告知,那么这会给你带来各种各样的安全问题 - 在SQL Injection上查找一些信息。

+0

当我使用你给我的代码时,我得到了另一个错误,如下所述:Microsoft OLE DB Provider for Oracle错误'80040e07' ORA-01722:无效号码 –

+0

@RallyCautiverio是发票号码和实际数值吗?这就是你的问题所暗示的,所以答案是如何格式化的。 – AnonJr

+0

是的,这是... invoice_num是一个实际的数值... –