我可以从 Netezza 导出 SQL 查询结果吗?

Posted

技术标签:

【中文标题】我可以从 Netezza 导出 SQL 查询结果吗?【英文标题】:Can I export the SQL query results from Netezza? 【发布时间】:2013-05-06 09:55:27 【问题描述】:

我们希望在 Netezza IDE 中运行查询并以 CSV 文件的形式导出结果。是否有任何 API 可以让我们使用 shell 或其他脚本来做同样的事情?

是否有任何人都知道的可用于 Netezza 的 shell,使用它我可以运行 SQL 查询并在文本文件或 CSV 文件中获取结果(首选)?

【问题讨论】:

【参考方案1】:

适用于 Netezza 的 Aginity Workbench 可让您轻松做到这一点。该应用程序是在 Windows 下运行的 IDE。此外,它还为您提供了一个命令行界面,以便可以从 Windows 上的 cmd 或 bat 文件启动它。您可以使用 ODBC 或 OleDb 驱动程序连接到 Netezza。 更多信息在这里http://www.aginity.com

【讨论】:

在通过 Aginity 导出大型(>100 万行)数据集时,我经常遇到“内存不足”错误。不过,这绝对是处理小型临时请求的最简单方法。 如果您使用 Aginity Workbench 命令之类的参数,则可以避免使用 GUI,这应该可以解决“内存不足”错误。使用菜单选项 Tools -> Workbench Command Line Builder。【参考方案2】:

由于您的标签中有 powershell,我假设您需要一个在 Windows 下工作的工具。 Netezza 的命令行客户端 - nzsql - 不适用于 Windows,但有几个第三方命令行 sql 客户端/shell 可以与 Netezza 一起使用:

jisql,JDBC 客户端;参数与 SQuirreL 中的相同 dbish,基于 perl 的 ODBC 客户端;如果您的 ODBC DSN 称为 NZ,则命令行将是

dbish dbi:ODBC:NZ user password

这两个工具都可以选择将结果输出为 CSV 文件。

【讨论】:

【参考方案3】:

您可以使用 CREATE EXTERNAL TABLE 将数据从 Netezza 卸载到远程系统。有关详细信息,请查看 Netezza 数据加载指南,第 5 章。

但是,我发现最简单的方法是使用 SQL Squirrel 和 JDBC。在此处下载 SQL Squirrel:

http://squirrel-sql.sourceforge.net/

获取 Netezza JDBC 驱动程序并设置您的连接。连接到 NZ 实例后,转到 SQL 窗口,编写 SQL 查询。默认情况下,它将仅返回 100 行。但是,如果您右键单击结果,则会出现一个名为“导出到 CSV”的选项。选择该选项并确保选中“导出整个表格”复选框。这将拉出整个事情。

【讨论】:

【参考方案4】:

Netezza 有一个 ODBC 驱动程序,您应该能够使用该驱动程序让客户端应用程序从新西兰提取数据。

您还可以编写一个使用 nzsql 命令行查询工具将数据保存到文件中的 shell 脚本。我倾向于将 SQL 编写为字符串字段和逗号字符的串联:

SELECT FIELD1||','||FIELD2

这会在数据库中进行连接,这通常比客户端应用程序更快,因为您可以利用数据库的 MPP 特性。

我已经通过 powershell 成功使用 ODBC 连接从 Netezza 中提取数据:

$conn = new-object system.data.odbc.odbcconnection
$conn.connectionstring = "Driver=NetezzaSQL;servername=*SERVERNAME*;port=*PORT*;database=*DATABASE*;username=*USERNAME*;password=*PASSWORD*"
$conn.open()

$cmd = new-object System.Data.Odbc.OdbcCommand
$cmd.CommandText = [System.IO.File]::ReadAllText("C:\SQL\mysqlFile.sql")
$cmd.connection = $conn
$cmd.CommandTimeout = 0

$datareader = $cmd.ExecuteReader();
$stream = new-object System.IO.StreamWriter("C:\SQL\MyExportFile.csv", TRUE)

while ($datareader.Read())  $stream.WriteLine($datareader[0]) 
$stream.close()
$datareader.close()
$conn.close()

SQL 本身会为我在字段之间添加逗号。

【讨论】:

运行相同的代码,当然,使用我的文件路径,我在 $stream 行上得到一个错误:',' 之后缺少表达式。【参考方案5】:

如果你想要管道分隔的数据并且你没有太多的字段,你可以在 nzsql 命令中指定它。

nzsql -d $DB-u $USER-pw $PASS -h $HOST -c 
   "SELECT OTLT_KEY||'|'||NHS_OTL_CD||'|'||NPD_ST||'|'||NPD_CNTY||'|' 
   FROM OTL_NHS_RLTD" > ./OTL_NHS_RLTD.psv

【讨论】:

【参考方案6】:

我一直在 DBVisualizer 的 Netezza 中使用它

@export on;

@export set filename="C:\Users\XXXX\Desktop\NAMEYOURFILE.xlsx" CsvColumnDelimiter=",";

SELECT * FROM TABLE;

@export off;

【讨论】:

【参考方案7】:

nzsql -d $DB-u $USER-pw $PASS -h $HOST -c "SELECT OTLT_KEY||'|'||NHS_OTL_CD||'|'||NPD_ST||'|'||NPD_CNTY||'|' FROM OTL_NHS_RLTD" > ./OTL_NHS_RLTD.psv

nzsql -d $DB-u $USER-pw $PASS -h $HOST -c "SELECT OTLT_KEY||'|'||NHS_OTL_CD||'|'||NPD_ST||'|'||NPD_CNTY||'|' FROM OTL_NHS_RLTD" -o /path/OTL_NHS_RLTD.psv

【讨论】:

以上是关于我可以从 Netezza 导出 SQL 查询结果吗?的主要内容,如果未能解决你的问题,请参考以下文章

netezza nzsql 将查询结果导出到 csv 文件

将特定查询数据从 netezza 数据库导出到 CSV 文件

从 Visual Studio 2008 调用 netezza 查询'执行 SQL 任务

Netezza 从 SQL Server 加载表

Netezza 中数据库中所有表的行数

win 7 将 IBM netezza 数据库中的 sql 数据表导出到 txt 文件的错误