2012-07-06 21 views
1

我将查询结果卸载到文件中。我需要将结果记录显示在一行中。例如,在单行中追加查询的结果

unload to file.unl select col from table where col = "test"; 

产生的file.unl会像

test| 
test| 
.... 
test| 

但我想得是,

test|test|test|....|test| 

任何指导或想法赞赏。

由于

+0

这将工作http://stackoverflow.com/a/11356573/1216425 – teran 2012-07-06 08:42:03

+0

@teran:你能解释一下** FOR XML PATH .. **是否必须在4gl中? – 2012-07-06 10:26:25

+0

对不起,我没有注意到你正在使用4gl。以上答案适用于MS SQL; – teran 2012-07-06 11:17:18

回答

2

你可能知道,你可以在SQL或通过申报DELIMITER "|" DBDELIMITER环境变量。据我所知,没有办法将默认记录终止符从NEWLINE更改为其他任何内容。

所以我怀疑你需要写一个自定义函数来遍历结果并将它们追加到一个变量中,然后写到一个文件中,或者编写一个你通过RUN调用的独立脚本从行到列的数据,例如:

UNLOAD TO file.unl SELECT col FROM table WHERE ...;  
RUN "/usr/bin/perl -ni -e 'chomp; print' file.unl"; 

我假设你在Unix上运行,并有perl方便。如果你不这样做,你可能会发现迭代器的建议比在Windows上安装perl更加实用,特别是如果你对这个代码运行的机器的控制有限。

更新

我的4GL是很生疏,但我decribing一些非常基本的,如:

DEFINE command CHAR(10100) 
DEFINE long_string CHAR(10000) 
DECLARE curs1 CURSOR FOR 
    SELECT col FROM table WHERE ... 

FOREACH curs1 INTO col1 
    LET long_string = long_string CLIPPED || col1 CLIPPED || '|' 
END FOREACH 
LET command = "echo '" || long_string CLIPPED || "' > file.unl" 
RUN command 

这是15年,因为我写的任何4GL更多,所以可以把它看成伪代码最多,请。可能有更好的方法直接写入文件,我实在不记得了。

+0

我一直在使用Perl。有没有方法可以在不使用脚本的情况下完成此操 – 2012-07-07 12:59:58

+0

使用简单的迭代器示例更新了答案。我仍然认为perl版本更好;它的代码少,不易受到意外壳体解释的影响。 – RET 2012-07-08 10:45:08

+0

我已经修复了I4GL代码。除了最后一个换行符外,Perl机制将会逐渐走向平坦; I4GL代码很脆弱,容易溢出。 – 2012-07-08 21:07:55

1

CREATE TABLE #Table( PKEY INT主键, 字段VARCHAR(10) )

INSERT INTO #Table 选择1, 'ABS1' UNION ALL 选择2,' ABS2' UNION ALL 选择3, 'ABS3'

DECLARE @Results VARCHAR(MAX)= ''

SELEC牛逼 @Results = COALESCE( @Results + '|' +现场, @Results ) 从#Table

SELECT @Results

+0

这是什么语言?你为什么在结果前使用@?请解释。 – 2012-07-06 10:25:08

+0

这是一个sql查询。结果之前的@表示我创建了一个varchar变量来连接我的所有结果。我最终选择这个变量作为我的结果。 – 2012-07-06 10:29:26

+0

@Sarah:谢谢你解释..请理解我正在使用Informix-4GL进行查询。 – 2012-07-06 10:35:10