2012-03-12 57 views
3

我有一個很長的SQL文本,我想分配給查詢SQL。我這樣做的方式如下:德爾福 - 如何將字符串連接分成幾行

SQL.Text:= 'SELECT T1.COLUMN1,T2.COLUMN2,T1COLUMN3..........,'+ 
      ' T1.COLUMNn FROM TABLE1 T1 INNER JOIN '+ 
      ' TABLE2 T2 ON T1.ID=T2.ID'+ 
      ' WHERE T1.COLUMN10=100' 

實際的SQL比這個長20倍。我的問題是換行符。當我格式化源代碼(按Ctrl + d)有時離開行,因爲我打字,但有時它會刪除換行符,我得到這樣的:

'SELECT T1.COLUMN1,T2.COLUMN2,T1COLUMN3 ' + 'FROM TABLE1 T1 INNER JOIN '+ 'TABLE2 T2 ON T1.ID=T2.ID' 

,這導致了「太行長(超過1023個字符)「錯誤。有趣的是,這不會發生在所有行中。我無法理解將受到影響和不會影響的區別。我需要在「+」號之後或之前換行。我該怎麼做呢?

+0

什麼值的Formatter - > Delphi - >換行符 - >右邊距你有嗎?默認值(我記得)是80. – teran 2012-03-12 08:20:14

+0

你真的需要在代碼中編寫長的sql嗎?您可以在數據庫中創建存儲過程,或將SQL保存在查詢組件(即在dfm文件中)或從其他文件或資源加載。 – teran 2012-03-12 08:37:06

+0

@teran,右邊距是60.但是不管什麼價值,這個問題都不會發生在所有的行上。我知道你的SP是最好的選擇。我完全同意。 – 2012-03-12 10:23:31

回答

-1

嘗試在每一行指定值:

SQL.Text := 'SELECT T1.COLUMN1,T2.COLUMN2,T1COLUMN3..........,'; 
SQL.Text := SQL.Text + ' T1.COLUMNn FROM TABLE1 T1 INNER JOIN '; 
SQL.Text := SQL.Text + ' TABLE2 T2 ON T1.ID=T2.ID'; 
SQL.Text := SQL.Text + ' WHERE T1.COLUMN10=100'; 

我知道它看起來很醜,但我認爲它可以解決你的問題。

+2

這會導致運行時而不是編譯時間串聯。 – 2012-03-12 08:23:12

+5

而不是'SQL.Text:= SQL.Text + ....'你應該更好地編寫'SQL.Add(....);'這是更快,更容易閱讀。 – 2012-03-12 08:29:11

+2

如果你不介意運行時連接,它會更容易,並且更好地使用'SQL.Add('SELECT ...');' – 2012-03-12 08:29:14

14

您也可以使用添加功能。

SQL.Clear; 
SQL.ADD('SELECT T1.COLUMN1,T2.COLUMN2,T1COLUMN3..........,'); 
SQL.ADD(' T1.COLUMNn FROM TABLE1 T1 INNER JOIN'); 
SQL.ADD(' TABLE2 T2 ON T1.ID=T2.ID'); 
SQL.ADD(' WHERE T1.COLUMN10=100'); 
+0

其實我一直使用這種方法。但是在開始使用UniDac for Oracle連接後,當我添加這樣的SQL字符串時,我開始出現錯誤。這就是爲什麼我決定直接設置SQL.Text。 – 2012-03-12 10:20:11

+0

此外,這不是SQL.Text spicific的東西,我可以在任何其他情況下使用它。我只是想知道當串聯+符號的字符串被格式化爲一行時。 – 2012-03-12 10:24:14

+0

如果您想設置斷點,則將斷點設置爲Tstrings。單位Classes.TStrings.SetTextStr。在那裏你會看到TStrings.Text:='blabla'也使用Add函數 – Ravaut123 2012-03-12 10:52:41