为啥在构建SQL命令时使用地址符号@? [复制]

Posted

技术标签:

【中文标题】为啥在构建SQL命令时使用地址符号@? [复制]【英文标题】:Why is the address sign @ used in building SQL command? [duplicate]为什么在构建SQL命令时使用地址符号@? [复制] 【发布时间】:2011-11-09 10:29:09 【问题描述】:

可能重复:What's the @ in front of a string for .NET?

这个 SQL 命令中的@ 是做什么的?它的第一次和第二次出现的目的是否相同?

static DataTable StaffsGetProjectIDHRCoordinators(SqlConnection conn, string targetDatabase)

    try
    
        SqlCommand cmd = new SqlCommand(@"
            SELECT DISTINCT Staff.*
            FROM Staff
            INNER JOIN " + targetDatabase.Replace("'", "''") + @".dbo.ProjectHRCoordinator ProjectHRCoordinator
            ON Staff.StaffID = ProjectHRCoordinator.HRCoordinatorStaffID
            ORDER BY Staff.FName, Staff.LName", conn);

            return ExecuteDataTable(cmd);
    
    finally
    
        if (conn.State != ConnectionState.Closed) conn.Close();
    

我只是在声明存储过程的参数时熟悉@ 符号。

【问题讨论】:

这让我想哭。 .NET 对占位符有很好的支持。请使用它。您正在寻找的是verbatim literal strings - 请参阅示例。 这是一个带引号的字符串文字,它与sql或参数无关。 msdn.microsoft.com/en-us/library/362314fe(v=vs.71).aspx @pst:如果 OP 询问其目的是什么,那么可以说他/她不是代码的作者,而是希望了解它在做什么。 @Yuck 这就是链接的用途,自然。 是的,我正在尝试理解别人的代码。我为什么要问我是否是首先编写代码的人。尽管如此,还是感谢您的光临。 【参考方案1】:

这意味着该字符串是逐字字符串文字。 \ 不会以特殊方式处理。 \n 不是新行,它是斜线和 n。对路径非常有用。

通常,如果字符串包含 C:\Windows\myfile.txt,您需要编写 "C:\\Windows\\myfile.txt" 或使用逐字字符串文字 @"C:\Windows\myfile.txt"

这在 C# 规范的 2.4.4.5 String literals 中有介绍:

逐字字符串文字由一个@字符后跟一个双引号字符、零个或多个字符以及一个结束双引号字符组成。一个简单的例子是@"hello"。在逐字字符串文字中,分隔符之间的字符被逐字解释,唯一的例外是引号转义序列。特别是,简单的转义序列以及十六进制和 Unicode 转义序列不会在逐字字符串文字中进行处理。逐字字符串文字可能跨越多行。

我将在您引用的 SQL 块中添加它用于能够在多行中编写脚本而无需关闭字符串的每一行。如此安装

string str = "A " + 
    "B " + 
    "C";

你可以写

string str = @"A
    B
    C";

请注意,这两个字符串非常不同!第二个包含行尾和对齐空间,但在 SQL 中这不是问题(SQL 中的许多地方都会忽略空格)。

您有可能在一行中编写了 SQL 命令。然后@ 完全没用,但是许多程序员采用“比抱歉更安全”并且非常随意地使用它,尤其是当他们从其他地方粘贴可能包含\ escapes 的文本时:-)

【讨论】:

我要感谢引用的魔法仙女,它添加了我链接的页面的标题和文本的引用! :-) 知道在你帮助别人的同时有好仙女帮助你总是很高兴:-) :-)

以上是关于为啥在构建SQL命令时使用地址符号@? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

awk -F选项同时指定多个符号做为分割符时遇到空格坑,题目:请执行命令取出 linux 中 eth0 的 IP 地址

为啥我的所有 SQL 查询都必须使用 ` 符号包装?

为啥有符号负数转换为无符号数?

为啥修饰符顺序在 SwiftUI 中很重要? [复制]

为啥我无法解析符号“R”? [复制]

为啥使用Mysql命令source导入.sql文件时总是出错?