【问题标题】:Avoid entering double quotes from start & ending of a string避免在字符串的开头和结尾输入双引号
【发布时间】:2008-11-10 10:03:43
【问题描述】:

在数据库中,我有一个包含“默认”的字符串。我只想用 0 替换该默认值。我有类似的内容:

select * from tblname where test = 'default'

我不想用引号代替“默认”。

我想要

select * from tblname where test = 0

有什么办法吗?

【问题讨论】:

  • 你能不能只改变你演示的方式?
  • 请告诉我们您正在使用哪种编程语言/系统和数据库系统。
  • 不确定重新标记是否完全正确?他最初是在寻求 C# 的帮助,所以也许我们需要解释生成 SQL 而不是重新标记到 SQL 的危险?

标签: c# sql syntax


【解决方案1】:

我假设字段test 是文本类型(varchar、char 等)。

首先:更新表以包含“0”,其中包含“默认”。

UPDATE tblname SET test = '0' WHERE test = 'default'

然后:选择所有包含“0”的行。不能省略引号,因为它们是 SQL 语法的一部分。

SELECT * FROM tblname WHERE test = '0'

为了能够省略引号,您必须将字段转换为数字字段(int、float 等)。

【讨论】:

  • 即使在阅读了您的回答后,我也花了一段时间才理解这个问题。干得好。
【解决方案2】:

我认为使用格式字符串会更好

string myVar = "0";
string sql = String.Format(@"select * from tblname where test = \"{0}\"", myVar);

您还应该问自己为什么要即时生成内联 SQL 而不是使用存储过程,因为除非您清理输入,否则会发生 SQL 注入攻击。

【讨论】:

  • 由于重新标记这看起来离主题很远,但我相当确定原始问题的重点。应该讨论原始问题的优点,而不是编辑帖子并假设原始发布者的意思或想要的。
【解决方案3】:

为了实现简单的字符串替换,您可以做很多事情;但是,我强烈建议您研究参数化,以提供注入安全性和查询计划重用。

参数也可以通过避免引用问题而受益 - 所以只需将 'default' 替换为(例如)@p1 即可。此替换可以是:

-- TSQL
REPLACE(@cmd, '''default''', '@p1')

// C#
.Replace(@"'default'", @"@p1")

在 C# 中,这将是带有参数的 DbCommand;从 T-SQL 你可以考虑sp_ExecuteSQL。无论哪种方式,您都希望得到:

select * from tblname where test = @p1

并提供@p1 作为参数。所以从 C# 开始:

DbParameter param = cmd.CreateParameter();
param.Value = 0; // etc
cmd.Parameters.Add(param);

或来自 TSQL:

EXEC sp_ExecuteSQL @cmd, N'@p1 varchar(50)', 0

(将varchar(50)替换为正确的类型)

【讨论】:

    猜你喜欢
    • 2021-12-21
    • 1970-01-01
    • 2011-02-06
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多