T-SQL中的 '\' 和 '$' 的用途是什么?

6

根据我在SQL Server书籍中所找到的:

\ (反斜杠) (Transact-SQL)
将长字符串常量分成两行或多行以提高可读性。

SELECT Clause (Transact-SQL) ... $IDENTITY | $ROWGUID

$PARTITION (Transact-SQL)
返回一个集合的分区列值将被映射到哪个指定分区函数的分区号。

这些是在T-SQL,特别是SQL Server中使用\$的用法。

现在,我有一个查询如下:

SELECT \ a, $ b, \11 c, $12 d;

具有如下有效结果:

a    | b    | c     | d 
-----+------+-------+-------
0.00 | 0.00 | 11.00 | 12.00

我认为有些关于这个字符的东西我找不到了。
编辑: 我发现,如果货币符号后面跟着一个数字,SQL Server会删除定义的符号,并将该值存储为货币数据类型:
我认为,SQL Server将单个货币符号翻译成公式部分中的最后一个短语,这些部分位于 + 和 - 之间,仅在部分结尾处出现,例如-$、($),(12+$)、($) + 12、$ * (12-$)等,而不是$+1、2*$-1。另外,我发现$ 2与$2相同。
以上所有行为对于\都是相同的,这意味着SQL Server认为\是货币符号!

反斜杠在此处不是字符串常量的一部分,因此文档中记录的行为不适用。T-SQL解析器并不严格,因此有时允许解释格式错误的文字和语句。当然,依赖这种未记录的行为是脆弱的,因为行为可能随时改变并破坏代码。 - Dan Guzman
1
这意味着SQL Server认为\是一个货币符号!!!可能与历史上广泛使用的大多数兼容美国ASCII的日语编码有关,其中将日元符号放置在US-ASCII中的反斜杠代码点上。仍然有一些字体将反斜杠呈现为日元符号。 - user743382
2
这可以作为OP或愿意回答问题的人的起点:http://www.sqlservercentral.com/blogs/philfactor/2010/07/29/the-killer-backslach-in-tsql/ - Andriy M
支持你的观点,$\ £似乎被解析成相同的方式。 - ypercubeᵀᴹ
1个回答

7

我认为需要检查数据类型和每个值,注意到每个值的数据类型都是money。

WITH CTE
AS
(
    SELECT \ a, $ b, \11 c, $12 d   
)

SELECT  SQL_VARIANT_PROPERTY(a,'baseType') a,
        SQL_VARIANT_PROPERTY(b,'baseType') b,
        SQL_VARIANT_PROPERTY(c,'baseType') c,
        SQL_VARIANT_PROPERTY(d,'baseType') d
FROM CTE

结果:

a                              b                              c                              d
------------------------------ ------------------------------ ------------------------------ ------------------------------
money                          money                          money                          money

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接