2012-03-12 42 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