避免从start& amp;中输入双引号一个字符串的结尾

时间:2008-11-10 10:03:44

标签: c# sql syntax

在数据库中,我有一个包含“default”的字符串。我只想将该默认值替换为0.我有类似的东西:

select * from tblname where test = 'default'

我不想在替换“默认”时引用。

我想要

select * from tblname where test = 0

有没有办法做到这一点?

3 个答案:

答案 0 :(得分:4)

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

首先:更新表格以包含'0',其中包含'default'。

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

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

SELECT * FROM tblname WHERE test = '0'

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

答案 1 :(得分:0)

我认为你最好使用格式字符串

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

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

答案 2 :(得分:0)

为了实现简单的字符串替换,您可以执行许多操作;但是,我强烈建议您查看参数化,以提供注入安全性和查询计划重用。

参数也可以通过避免引用问题而受益 - 所以只需将'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)