2011-07-20 48 views
2

我正在考慮編寫一個用於生成T-SQL代碼的模板工具,它將包括如下所示的分隔段;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'。

回答

0

嗯,我不確定關於該語言的完整描述,但看起來~~可能出現在identifier前提是它被引用(通常在括號中)。

您可能會有更多的運氣與一個約定,說你不支持其中~~標識符。或者,只保留自己的詞彙符號,不要擔心~~發生在其他地方。

1

有幾個衆所周知的,經常使用的格式模板參數,一個例子是$(paramname)(也可用於其他腳本,以及T-SQL腳本)

爲什麼不使用現有的格式?

+0

看起來像重新創造一個商品輪子給我。 – dkretz

+0

@le dorfier:嗨,我不確定商品輪是什麼? –

+0

嗨 - 我指的是不斷改造的車輪... – dkretz

-1

您的轉義序列可以出現在字符串文字中,但這就是全部。也就是說,微軟擁有t-sql,並且他們可以自由地做任何他們想要的事情,以便爲將來的sql server版本前進。不過,我認爲~~是足夠安全的。

+0

〜實際上是按位NOT,這使得整數的身份運算符成爲整數。它實際上是完全有效的;例如'(SELECT ~~ 1)'=> 1.這就是爲什麼我想要我可以用於正確選擇的文件證據。我只是希望保證SQL Server 2005到2008r2的T-SQL。 –

0

我不確定你會發現什麼從來沒有發生在一個有效的聲明。試想一下:

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

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

0

你可以把引用文字和字符串作爲內容,無論它們是否包含您的轉義序列。這會使它更加健壯。

通過詞法分析器運行文本,分離每個標記。如果令牌是字符串或帶引號的文字,則將其視爲同樣。但是,如果它是以~~開頭和結尾的字面值,則可以安全地假定它是模板佔位符。

1

如果~~是合法的TSQL或沒有,如果您在需要時提供在實際TSQL中生成~~的轉義符,則無關緊要。

由於模板參數必須具有非零長度標識符,因此您有一個特殊情況,其中標識符長度可笑地爲「零」,例如~~~~。這種事情是一種理想的逃避順序,因爲它對於其他任何事情都沒有用處。簡單地處理您的模板文本;每當你發現~~~~把它替換成命名參數字符串,並且每當你發現~~~~把它替換爲~~。現在,如果在最終的TSQL中需要~~,只需在模板中寫入~~~~即可。

我懷疑,即使你這樣做了,實際寫出來的次數~~~~實際上接近於零,所以做這件事的理由是理論上的完整性,給你一個溫暖的模糊感覺你可以在模板中寫任何東西。