【问题标题】:Sybase isql won't execute sql file when USE DB GOSybase isql 在 USE DB GO 时不会执行 sql 文件
【发布时间】:2018-05-15 15:08:44
【问题描述】:

我正在使用 iSQL 执行 sql 文件的 uDeploy 上创建此进程。我的问题是我必须在过程中设置服务器和数据库名称。

在 SQL 文件中 - 我们可能需要使用其他数据库,因此它必须在文件中包含 USE DBNAME GO。

但是,它没有在 USE 语句之后到达/执行更新语句。

是否有任何与 sybase、isql 相关的东西不允许这样做? 只能从 isql 执行一条语句吗?

正在运行的典型 linux cmd 是

sybase.sh; isql -U username -P **** -S servername:port -D dbname -X -i sqlfile.sql

SQL 文件示例:

USE dbname
go
update table set field = 'date' where field1 ='blahblah' and field2 ='blah'
go

编辑:

这可能是因为在命令中设置了 DBNAME。谁能确认一下?

【问题讨论】:

  • 一个表有,而不是字段。
  • 好吧 - 错误的词,但这并没有增加解决方案。无论如何,由于在命令 probs 中设置了 hte dbname,还没有看到有人试图在其中更改 db,所以无法确定。
  • 如果您使用一些示例数据库名称更新您的示例会有所帮助;照原样,dbname == dbname,因此两个示例都应该在名为 dbname 的数据库中运行您的查询……假设您的登录名可以访问名为 dbname 的数据库;我假设你有不同命名的数据库......在这种情况下,我已经解释了一个可能的问题(见我的回答 - 下文)

标签: unix sybase isql udeploy


【解决方案1】:

一些背景:

从命令行:

isql -U ... -P ... -D >dbname< -i >script<
  • 将在名为&gt;dbname&lt; 的数据库中运行&gt;script&lt;(假设您的登录名可以访问&gt;dbname&lt; 数据库;否则脚本将在您登录名的默认数据库中运行)

在脚本中:

use >dbname<
go
select ...
go
  • 假设您的登录名可以访问数据库&gt;dbname&lt; ...
  • 将会话放置在数据库名称&gt;dbname&lt; 和...
  • 然后运行您的查询
  • 如果您无权访问 &gt;dbname&lt; 数据库,那么您应该会收到一条错误消息,并且后续查询将在您的默认数据库中运行

您的(可能的)问题:

  • isql / -D &gt;dbname&lt; 将设置目标数据库...
  • 脚本中的use &gt;dbname&lt; 将优先,并在运行后续查询之前确定您最终放置在哪个数据库中

一个例子...

$ myquery.sql
use tempdb
go
select count(*) from sysobjects
go

$ isql -S ... -U ... -P ... -i myquery.sql
  • 由于在isql 命令行上没有提供-D 参数,因此在运行select 之前,脚本会将您置于tempdb 数据库中

现在如果我们添加 -D 标志 ...

$ isql -S ... -U ... -P ... -D master -i myquery.sql
  • isql 命令行选项-D master 最初会将您的会话放在master 数据库中...
  • 脚本将覆盖此设置,然后将您置于tempdb 数据库中
  • 最终结果是select 将在tempdb 数据库中运行

【讨论】:

  • 如果 isql / -D >dbnamedbname
  • 没关系;先应用isql/-D,然后应用use(即use 覆盖isql/-D
猜你喜欢
  • 2016-12-01
  • 2019-01-23
  • 1970-01-01
  • 2017-11-24
  • 1970-01-01
  • 2013-10-29
  • 2021-10-21
  • 1970-01-01
  • 2017-03-10
相关资源
最近更新 更多