T-SQL语言规范和lexing规则

时间:2011-07-20 01:19:19

标签: sql tsql code-generation lexical-analysis

我正在考虑编写一个用于生成T-SQL代码的模板工具,其中包括如下的分隔部分;

SELECT 
    ~~idcolumn~~
FROM
    ~~table~~
WHERE
    ~~table~~.flag = 1

注意双圈分隔位?这是我的模板语言中的转义序列的想法。但我想确定转义序列是有效的 - 它永远不会出现在有效的T-SQL语句中。问题是,我找不到任何关于T-SQL语言的官方微软描述。

有没有人知道T-SQL语言的官方规范,或者至少是lexing规则?所以我可以对逃生序列作出明智的决定。

更新:

感谢目前为止的建议,但我并不是要确认'~~'转义序列本身。我需要的是一个我可以参考的文档,我可以指出并说'微软说这个字符序列在T-SQL中完全不可能。'例如,microsoft发布了C#here的语言规范,其中包括对可以进入有效C#程序的字符的描述。 (参见pdf的第67页。)我正在寻找类似的参考资料。

双波浪:“~~”实际上是非常好的T-SQL。例如; “(SELECT ~~ 1)”返回'1'。

6 个答案:

答案 0 :(得分:1)

模板参数有几种众所周知且经常使用的格式,一个例子是$(paramname)(也用于其他脚本以及T-SQL脚本)

为什么不使用现有格式?

答案 1 :(得分:1)

如果~~是合法的TSQL并不重要,如果你提供了在你需要的时候在实际的TSQL中生成~~的转义。

由于模板参数必须具有非零长度标识符,因此您有一种特殊情况,其中标识符长度可笑地为“零”,例如,~~~~。这种事情是一个理想的逃脱序列,因为它对其他任何东西都是无用的。只需处理您的模板文字;每当你找到~~~~用命名参数字符串替换它,并且每当你找到~~~~用~~替换它。现在,如果在最终的TSQL中需要~~,只需在模板中编写~~~~即可。

我怀疑即使你这样做,你实际写的次数~~~~在实践中也会接近于零,所以这样做的理由是理论上的完整性并给你一种温暖的模糊感觉你可以在模板中写任何东西。

答案 2 :(得分:0)

好吧,我不确定该语言的完整描述,但~~可能会出现~~,只要它被引用(通常在括号中)。

如果您不支持其中包含~~的标识符,您可能会更幸运。或者,只需保留自己的词法符号,不要担心{{1}}在其他地方发生。

答案 3 :(得分:0)

我不确定你会在有效的陈述中发现永远不会的东西。考虑一下:

DECLARE @TemplateBreakingString varchar(100) = '~~I hope this works~~'

CREATE TABLE [~~TemplateBreakingTable~~] (IDField INT Identity)

答案 4 :(得分:0)

您可以将引用的文字和字符串视为内容,无论它们是否包含转义序列。它会使它更强大。

通过词法分析器运行文本,以分隔每个标记。如果令牌是字符串或带引号的文字,请将其视为此类。但如果它是以~~开头和结尾的文字,您可以放心地假设它是模板占位符。

答案 5 :(得分:-1)

您的转义序列可以在字符串文字中出现,但这就是全部。也就是说,微软拥有t-sql,他们可以随心所欲地为未来版本的sql server继续前进。不过,我认为~~足够安全。