经典ASP SQL参数化-如何从参数中删除单引号?

经典ASP SQL参数化-如何从参数中删除单引号?,sql,asp-classic,quotes,parameterized,Sql,Asp Classic,Quotes,Parameterized,我使用经典ASP和参数化SQL查询字符串,如下所示: SQL = "SELECT * FROM content WHERE Category LIKE ? ORDER BY SubDate ?" SQL查询字符串正在以下参数化代码中使用: Set cmd = Server.CreateObject("ADODB.Command") Set rsView = Server.CreateObject("ADODB.Recordset") cmd.ActiveConnection = MM_conn

我使用经典ASP和参数化SQL查询字符串,如下所示:

SQL = "SELECT * FROM content WHERE Category LIKE ? ORDER BY SubDate ?"
SQL查询字符串正在以下参数化代码中使用:

Set cmd = Server.CreateObject("ADODB.Command")
Set rsView = Server.CreateObject("ADODB.Recordset")
cmd.ActiveConnection = MM_connContent_STRING
cmd.Prepared = true
cmd.CommandType = adCmdText
cmd.CommandText = SQL
cmd.CommandTimeout = 60

cmd.Parameters.Append(cmd.CreateParameter("Category", 202, adParamInput, 30, qFilter))
cmd.Parameters.Append(cmd.CreateParameter("SubDate", 202, adParamInput, 10, myDateSort))

rsView.CursorLocation = adUseClient
rsView.Open cmd, , adOpenForwardOnly, adLockReadOnly

除了一个大问题外,上面的代码工作得很好。“按子日期排序?”部分输出“按子日期排序‘DESC’”,其中,由于DESC是一个参数,因此在其周围添加了单引号。我在运行上面的代码时遇到了一个错误的语法错误,因为DESC周围有单引号(根据用户通过URL查询字符串选择和发送的内容,DESC也可以是ASC)。似乎所有SQL参数都是用单引号输出的。如何从特定的SQL参数中删除单引号,使它们不会在SQL字符串中产生语法错误?

允许关键字(或标识符)作为参数是非常少见的。据我所知,没有一个框架支持它

既然只有两个允许的值,为什么不简单地写下:

SQL = "SELECT * FROM content WHERE Category LIKE ? ORDER BY SubDate "
If myDateSort = "ASC" Or myDateSort = "DESC" Then
    SQL = SQL & myDateSort
Else
    'whoops, value not allowed. raise error... 
End If
'...rest of your code... 

允许关键字(或标识符)作为参数是非常少见的。据我所知,没有一个框架支持它

既然只有两个允许的值,为什么不简单地写下:

SQL = "SELECT * FROM content WHERE Category LIKE ? ORDER BY SubDate "
If myDateSort = "ASC" Or myDateSort = "DESC" Then
    SQL = SQL & myDateSort
Else
    'whoops, value not allowed. raise error... 
End If
'...rest of your code... 

谢谢你的快速回复。我试图通过使用参数化查询来避免SQL注入。由于myDateSort是通过URL字符串传递的用户定义变量,因此我相信,如果我在代码中所示的参数之外直接使用myDateSort变量,用户仍然可以修改我的SQL查询。这是正确的吗?再次感谢!实际上,现在我看到我们正在使用If函数控制分配给myDateSort的值。我想这会保证这个值的安全。好吧,我一直在考虑你的解决方案。本质上,我们正在使用If函数“清理”myDateSort变量。关于您的解决方案,我现在的问题是,为什么不清理所有用户输入,而不是参数化所有SQL查询?尽管如此,我已经读到很多地方认为卫生处理是不够的。您对此有何想法?@user1531027,IF条件确保只能传递允许的值是正确的。如果它让您感觉更好,您当然可以编写
如果myDateSort=“ASC”那么SQL=SQL+“ASC”ElseIf myDateSort=“DESC”那么SQL=SQL+“DESC”其他。。。如果
等,则结束。但这将对结果产生完全零的差异。@user1531027关于参数与清理输入:与流行的观点相反,准备好的语句参数最初不是为清理输入而设计的。相反,其想法是,RDBMS可能会多次或至少多次处理类似的查询,并且可以通过对此类查询的模板进行一次解析和规划来获得资源和性能。要执行这样的模板,值必须绑定到值占位符(the?)。这也是为什么参数通常不适用于查询的结构方面,如关键字和标识符。感谢您的快速回复。我试图通过使用参数化查询来避免SQL注入。由于myDateSort是通过URL字符串传递的用户定义变量,因此我相信,如果我在代码中所示的参数之外直接使用myDateSort变量,用户仍然可以修改我的SQL查询。这是正确的吗?再次感谢!实际上,现在我看到我们正在使用If函数控制分配给myDateSort的值。我想这会保证这个值的安全。好吧,我一直在考虑你的解决方案。本质上,我们正在使用If函数“清理”myDateSort变量。关于您的解决方案,我现在的问题是,为什么不清理所有用户输入,而不是参数化所有SQL查询?尽管如此,我已经读到很多地方认为卫生处理是不够的。您对此有何想法?@user1531027,IF条件确保只能传递允许的值是正确的。如果它让您感觉更好,您当然可以编写
如果myDateSort=“ASC”那么SQL=SQL+“ASC”ElseIf myDateSort=“DESC”那么SQL=SQL+“DESC”其他。。。如果
等,则结束。但这将对结果产生完全零的差异。@user1531027关于参数与清理输入:与流行的观点相反,准备好的语句参数最初不是为清理输入而设计的。相反,其想法是,RDBMS可能会多次或至少多次处理类似的查询,并且可以通过对此类查询的模板进行一次解析和规划来获得资源和性能。要执行这样的模板,值必须绑定到值占位符(the?)。这也是为什么参数通常不适用于查询的结构方面,如关键字和标识符。