在 C# 中为 SQL 创建一个字符串,其中包含存储过程中的函数

本文关键字:包含 存储 存储过程 函数 过程中 字符串 一个 SQL 中为 创建 | 更新日期: 2023-09-27 18:35:17

我有一个这样的存储过程:

ALTER PROCEDURE autoCompleteFeedback
    @words varchar(255) 
AS
BEGIN
    SET NOCOUNT ON;
    SELECT DISTINCT TOP 5 * 
    FROM feedback 
    WHERE CONTAINS(feedbackMsg, @words)  
      AND NOT feedbackMsg LIKE '%Del%';
END
GO
EXEC autoCompleteFeedback '"*Who*"'

效果很好

但是现在我想将一个词从 C# 传递到我的过程中

例如:

 string myString = "whooHoo";
 string auto = '"*+myString+*"';
 var a = nm.autoCompleteFeedback(auto).ToList();

我无法正确获得转义字符,可能吗?

提前致谢

在 C# 中为 SQL 创建一个字符串,其中包含存储过程中的函数

您可以使用反斜杠对引号进行转义:

string auto = $"''"*{myString}*'"'";

或者,可以在字符串之前使用 @ 符号来获取逐字字符串文本。这样,您就可以使用双引号转义引号:

string auto = $@"'""*{myString}*""'";

在这种情况下,我会选择第一个选项,因为在我看来它更具可读性。

通过使用$您可以将变量插入到带大括号的字符串中:

string name = "Alexander";
string greet = $"Hello {name}";
//greet = "Hello Alexander"

有两种方法:

  1. 使用反斜杠。要逃脱"你必须使用'"
  2. 使用
  3. @"Your query" 在查询内部使用 "" 来转义 wuotes

第二个选项允许您定义多行字符串,如下所示:

var query= @"Alter PROCEDURE autoCompleteFeedback
-- Add the parameters for the stored procedure here
@words varchar(255) 
AS
BEGIN
SET NOCOUNT ON;
select distinct top 5  * from feedback where CONTAINS(feedbackMsg,@words)
AND NOT feedbackMsg LIKE '%Del%';
END
";

重要提示:永远不要连接字符串来执行任何类型的 SQL。请始终使用参数,否则您将面临SQL注入攻击。

最简单的答案;

string myString = "whooHoo";
string auto = "''"*" + myString + "*'"'";
Console.WriteLine(myString); // whooHoo
Console.WriteLine(auto); // '"*whooHoo*"'