sybase isql 中的默认输出(文本)宽度为 80。-w
当在命令行上启动 isql 时,可以使用标志更改它:
isql -w 200 -S... -U... -P...
Run Code Online (Sandbox Code Playgroud)
现在,我想知道当我已经连接时是否有可能更改文本宽度。我会期待类似的东西
1> set columnwidth 200
2> go
Run Code Online (Sandbox Code Playgroud)
或类似的东西。然而,在文档中我无法找到这个方向的东西。那么,这是否意味着这是不可能的,还是我找错了地方?
注意:我是开发人员...
我有一个资产表,其中包含许多代码,这些代码是进入第二个表 OutlineFiles 的外键。OutlineFiles 表将类型和代码作为主键。外键约束需要看起来像这样......
ALTER TABLE "dbo"."Assets"
ADD CONSTRAINT "Locations" FOREIGN KEY ( "LN", "LocationCode" ASC )
REFERENCES "dbo"."OutlineFiles" ( "Type", "Code" );
ALTER TABLE "dbo"."Assets"
ADD CONSTRAINT "CostCentre" FOREIGN KEY ( "CC", "CostCentreCode" ASC )
REFERENCES "dbo"."OutlineFiles" ( "Type", "Code" );
Run Code Online (Sandbox Code Playgroud)
因此,将通过“LN”和“CC”的固定值与轮廓表建立关系。或者将数据库更改为有两个表并删除 OutlineFiles 表上的 Type 列会更容易吗?我正在 Sybase 中尝试这个,但我们支持许多数据库。
这似乎是一件微不足道的事情很容易,但我找不到一个好的方法来做到这一点。
这就是我想出的:
select convert(numeric,
(select convert(varchar,datepart(yy,getdate())) +
right('0' + convert(varchar,datepart(mm,getdate())), 2) +
right('0' + convert(varchar,datepart(dd,getdate())), 2)
))
Run Code Online (Sandbox Code Playgroud)
编辑:我知道它不需要这样的子查询,但忽略 =p
我们有一个 Sybase 数据库,当前在某些表中存储日期时间值。如果我们将装有 Sybase 数据库的服务器移动到位于另一个时区的另一个国家/地区,数据库中的日期时间值是否会以不同的方式表示?
换句话说,请考虑以下场景:
Sybase 数据库在时区 +2:00 运行。
从我位于时区 +1:00 的 Java 应用程序中,它将 1970 年 1 月 1 日 1:00 写入数据库,这是应用程序时区中的纪元 0。
preparedStatement.setTimestamp(3, new Timestamp(0));
Run Code Online (Sandbox Code Playgroud)
但是,当我使用 SQL Workbench/J 客户端(时区 +1:00)查询数据库时,我看到
1970-01-01 01:00:00
Run Code Online (Sandbox Code Playgroud)
在我的桌子上。事实上,无论我将计算机时钟更改为哪个时区,SQL Workbench/J 客户端始终1970-01-01 01:00:00
从数据库中读取数据。
位于时区 +3:00 的另一个 Java 客户端读取的值与
1970-01-01 01:00:00
Run Code Online (Sandbox Code Playgroud)
翻译为纪元-7200000
或-2:00
客户的时区!
那么回到我原来的问题,Sybase 是否将日期时间值存储为字符串或纪元?我没有可以进行实验的免费 Sybase 服务器,那么当我们将服务器移动到另一个时区不同的国家/地区时,我们会发生什么情况呢?
我们使用的类型是“datetime”,例如:
CREATE TABLE "dbo"."whatever" (eventDate datetime NOT NULL);
Run Code Online (Sandbox Code Playgroud) 在我的 sybase 12 中,当我查看 select distinct 查询GETSORTED
的 showplan 时,我看到了 showplan 的输出。
我已经搜索了整个互联网(是的!),但似乎找不到一个链接来说明实际对数据进行排序的顺序GETSORTED
?
我有理由相信它对不同行的列中数据的大小进行排序,对于相同长度的行,它按字母顺序排序。
执行计划:
W (5): STEP 1
W (6): The type of query is INSERT.
W (7): The update mode is direct.
W (8): Worktable1 created, in allpages locking mode, for DISTINCT.
W (9):
W (10): FROM TABLE
W (11): tablename
W (12): Nested iteration.
W (13): Table Scan.
W (14): Forward scan.
W (15): Positioning at start of table.
W (16): Using …
Run Code Online (Sandbox Code Playgroud) 在我们的 SQL Server 生产环境中,一些用户运行临时查询,将大量数据提取到 tempdb 中并将其填满,从而导致生产服务器出现问题。当这些报告/查询从前端运行时,它们有时会弄乱将数百万行拉到临时表的日期范围。是的,用户需要接受教育,也需要调整,我们已经这样做了,但他们仍然偶尔会产生问题。
现在他们说在 SAP ASE (Sybase) 中有一个功能可以创建多个 tempdb 和重定向用户并限制使用,通过不膨胀单个 tempdb(就像在 SQL Server 中一样)并使服务器停机。
我们在 SQL Server 中有这样的东西吗?
有很多解释为什么 NOT IN NULL 不起作用,但我没有看到任何解决方案。(最近的问题在这里:为什么 NOT IN 包含 NULL 的集合总是返回 FALSE/NULL?)
我有 6 个存储过程的可选参数,用于过滤查询的某个值。以前的开发人员做了这样的事情:
IF @var1 IS NULL AND .....
select ...
else
select ...
where value in (@var1, ...)
Run Code Online (Sandbox Code Playgroud)
我不是特别喜欢这个。(查询非常庞大),所以我决定选择这样的东西:(
无论如何,我们在临时表中得到了结果)
IF @var IS NOT NULL OR ...
delete from #temp where value not in (@var1,...)
Run Code Online (Sandbox Code Playgroud)
但我意识到这行不通。
我唯一能想到的就是创建另一个临时表,该表将只保存@var1 等中的非空值(使用 if 语句或删除 where 为 NULL),然后对该表进行连接删除。
有没有更好的办法?
为了更新数据库(Sybase Adaptive Server Anywhere 8),我从客户端计算机上的一个数据库中获取所有数据并使用
SELECT * FROM tabelName OUTPUT TO 'C:\path' FORMAT ASCII DELIMITED BY ';';
Run Code Online (Sandbox Code Playgroud)
然后我使用这些文件来更新另一个连接到服务器的数据库,方法是制作临时表,检查是否缺少任何内容,然后删除临时表。
INPUT INTO tempTable FROM 'C:\path' FORMAT ASCII DELIMITED BY ';';
INSERT INTO mainTable
SELECT *
FROM tempTable
WHERE id NOT IN (SELECT id FROM mainTable);
DROP TABLE tempTable;
Run Code Online (Sandbox Code Playgroud)
所以我想知道是否有更好的方法来做到这一点,因为两个表需要很长时间来导出和导入数据(尽管它们确实有大量的列和数据,但仍然和大量的数据我的意思是〜100列和约 100,000 行)。这尤其奇怪,因为另一个具有相似数据量的表通过得非常快(尽管它的列确实较少)。需要一段时间的两个表每秒读取约 1000 个数据,而其他表要快得多。
每个客户的笔记本电脑上都有 database.db 文件。他们获取了一些数据并需要提交它但没有连接,因此他们使用自己的 .db 文件并稍后更新服务器上的文件。
获取 SQL 定义可能很困难,因为表是在前一段时间制作的,我不知道如何获取它们。目标数据库是保存所有数据的数据库,而源数据库是未连接且可在需要时离线使用的数据库。
一些建议,提示将不胜感激。