尝试使用来自 Visual Studio.net 2005 的 oledb 连接连接到 sybase 数据库时出现此错误
The 'Sybase ASE OLE DB Provider' provider is not registered on the local machine.
Run Code Online (Sandbox Code Playgroud) 上周我惊讶地发现 sybase 12 不支持全外连接。但我突然想到,一个完整的外连接应该与同一个 sql 的右外连接联合的左外连接相同。任何人都可以想出一个不成立的原因吗?
我想生成从 0 到 9000000 的数字。在 Oracle 中,我可以使用以下代码。如何在 Sybase ASE 中执行此操作?
这是在 Oracle 中:
SELECT level Num
FROM DUAL
CONNECT BY LEVEL <= 9000000
ORDER BY Num;
Run Code Online (Sandbox Code Playgroud)
如何在 Sybase ASE 中做到这一点?
我无法创建表并添加身份,因为我需要从 1 到 9000000 的数字,因此表会很复杂。是否有查询可以执行此操作?
我需要计算表的行数,但我收到了 count(*) 异常行为的提示。
当我在空表上使用多列选择时,count(*) 不返回结果。但如果我从 select 语句(单列选择)中删除其他列,则会返回预期结果(0 行)。
在下面的代码中,您将找到多个测试来向您展示我在说什么。
下面代码的结构是:
1)创建表
2)空表测试上的多列选择,返回意外结果
3)空表测试单列select,返回预期结果
4)填充表测试上的多列选择,返回预期结果
问题
鉴于这个结果我的问题是:
为什么空表上的多列选择不返回0,而单列选择返回0?
预期结果定义
对我来说预期结果意味着:
如果表为空,count(*) 返回 0。
如果表不为空,则返回行数
--创建测试表
CREATE TABLE #EMPTY_TABLE(
ID INT
)
DECLARE @ID INT
DECLARE @ROWS INT
Run Code Online (Sandbox Code Playgroud)
--空表多列选择
--assignment attempt (Multi-column SELECT)
SELECT @ID = ID, @ROWS = COUNT(*)
FROM #EMPTY_TABLE
--return Null instead of 0
SELECT @ROWS Test_01 , ISNULL(@ROWS, 1 )'IS NULL'
--Set variable with random value, just to show that not even the assignment is happening
SET @ROWS …
Run Code Online (Sandbox Code Playgroud) 我可以从 .NET 程序(使用 ODBC)或通过数据库管理工具(用 Java 编写)访问数据库。
\n\n如果我从 .NET 程序向数据库写入 \'\xc3\xa9\' 字符,则它在数据库管理工具中显示为 \'\xc3\x95\'(大写 O 带波形符)。
\n\n如果我从数据库管理工具向数据库写入\'\xc3\xa9\'字符,它在.NET程序中显示为\'\xc3\x85\'(大写A,顶部有一个圆圈)。
\n\n我并不是想真正解决问题(即让两个程序显示相同的内容),尽管那会很好。我只是想猜测每个字符集使用哪些字符集来解释数据,这样如果我使用 .NET 转储数据并使用该工具重新输入数据,我就可以自己进行转换。
\n\n那么,哪种 2 个字符集的组合会导致上述字符不匹配呢?
\n\n感谢您的帮助。
\n\n编辑:使用Sybase ASE 12.5
\n\n编辑:基本上问题是:您是否知道一种字符编码,其 E9 代码点表示字符 \'\xc3\x95\' (带有波形符的大写 O)或 \'\xc3\x85\' (带有一个圆圈的大写 A顶部)?(假设其中一个使用拉丁语 1,因此使用 E9,我认为很有可能)
\n\n编辑:保罗的解决方案做到了。关于字符集的答案是:hp-roman8
\n我尝试在test_tbl 中添加一个新列column2并将该列设置为默认值'N/A'而不是 null。声明如下:
if not exists (select 1 from syscolumns where object_name(id) = 'test_tbl' and name = 'column2')
begin
alter table test_tbl add column2 varchar(20) default 'N/A' not null
end
Run Code Online (Sandbox Code Playgroud)
错误是
Could not execute statement.
Column names in each table must be unique. Column name 'column2' in table 'test_tbl' is specified more than once.
Sybase error code=2705
Severity Level=16, State=3, Transaction State=1
Line 4
Run Code Online (Sandbox Code Playgroud)
但是如果我添加一列可以为空。
if not exists (select 1 …
Run Code Online (Sandbox Code Playgroud) 例如yyyy-mm-dd
,我想以这种格式获取日期2014-04-11
。但似乎没有办法在 Sybase (ASE 12.5) 中使用convert函数来做到这一点。
目前,我得到 112 的日期并添加-
数字之间。有什么好办法吗?
显然,''
在 VARCHAR 列中插入空字符串 ( ) 时,Sybase(在 ASE 15.7 中测试)会插入一个空格字符。实验我验证了该选项ansinull
对这种行为没有任何影响:
> set ansinull on
> create table a (a1 varchar(1))
> insert into a(a1) values ('')
> select a1, len(a1) as 'len(a1)', datalength(a1) as 'datalength(a1)',
ascii(a1) as 'ascii(a1)', char_length(a1) as 'char_length(a1)'
from a
> go
(1 row affected)
a1 len(a1) datalength(a1) ascii(a1) char_length(a1)
-- ----------- -------------- ----------- ---------------
1 1 32 1
(1 row affected)
>
>
> drop table a
> go
> set ansinull off …
Run Code Online (Sandbox Code Playgroud) 我正在尝试获取 Sybase ASE 数据库中表的当前周的开始和结束日期,并将这些日期作为可以添加到插入调用中的变量返回。
理想情况下,该功能可以简单地基于该getDate()
功能工作。我尝试了其他方法并查看了其他答案,但很少有人专门针对 Sybase 语法。任何帮助,将不胜感激!
sap-ase ×10
sql ×5
sybase ×5
alter-table ×1
datetime ×1
getdate ×1
oledb ×1
sql-server ×1
t-sql ×1
vb.net ×1