【问题标题】:How do I deal with a passed parameter that may have an apostrophe in SQL Server?如何处理在 SQL Server 中可能带有撇号的传递参数?
【发布时间】:2018-03-06 19:54:15
【问题描述】:

我在 TestComplete 的循环中使用查询,每次循环完成时,都会使用新值更新变量。我想考虑变量中撇号的可能性,以便我可以使用一个查询。例如:

i = 0;

while(i < companyCount)
{                             
    result = CompanyAddress(company);
    Log.Message(result);
    i++;
}

'CompanyAddress' 是我存储在另一个脚本文件中的查询,'company' 是被传递的变量。

SELECT address FROM table WHERE name = '" + company + "';

我尝试了 REPLACE(),但在第二次迭代时并没有解决问题。

【问题讨论】:

  • 您通过在查询中使用参数来处理它们。
  • name = "Try this" 不是有效的 SQL Server TSQL 代码
  • 对不起这个可怜的例子。 “名称”是从 TestComplete 传递到查询中的字符串变量。
  • 我更新了示例以更好地复制我想做的事情。
  • 不要将值连接到查询中,使用带参数的正确查询。

标签: sql-server string-formatting jscript testcomplete ssms-2016


【解决方案1】:

要在 SQL 字符串中转义撇号,请使用双撇号:

SET @name = "Dan''s example"

但最好的方法是对查询进行参数化,这也有助于防止 SQL 注入。

【讨论】:

  • 我很抱歉,我的例子写得不好。我有参数化查询,但有些参数可能有撇号。上面的“名称”是为了表示传递给查询的 TestComplete 变量。
  • @Dan 我认为您应该添加调用 TestComplete 的代码。看起来那是您需要解决问题的地方。如果您不是从 SQL Server 调用,则可以添加一个带有您正在使用的编程语言的标签,以便该语言专家可以帮助您。
  • 我更新了我的示例以更好地复制我想做的事情。
  • 正确的解决方案不是尝试转义值,而是使用适当的参数化查询。
  • @MarkRotteveel 当然,答案的最后一句也是这样说的,不是吗?
【解决方案2】:

我错误地使用了我在最初解释中提到的 REPLACE() 方法。

我将带有单引号的变量发送到查询:

var test = "agwh'waf'2";

但是当我将它包含在查询中时,我使用了以下内容:

"select * from table where name = " + test.replace(/'/g, "\'\'");

这在运行查询之前用两个单引号替换了我的变量中的单引号。

【讨论】:

  • 正确的解决方案不是尝试转义值,而是使用适当的参数化查询。
猜你喜欢
  • 1970-01-01
  • 2022-10-06
  • 1970-01-01
  • 2018-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-30
  • 1970-01-01
相关资源
最近更新 更多