我可以访问命令行isql,我喜欢获取给定数据库的所有表的元数据,可能是格式化文件.我怎么能做到这一点?
谢谢.
所以我有一个Sybase存储过程,它接受1个参数,这是一个以逗号分隔的字符串列表,并在IN()子句中使用in运行查询:
CREATE PROCEDURE getSomething @keyList varchar(4096)
AS
SELECT * FROM mytbl WHERE name IN (@keyList)
Run Code Online (Sandbox Code Playgroud)
如何在列表中调用超过1个值的存储过程?到目前为止我已经尝试过了
exec getSomething 'John' -- works but only 1 value
exec getSomething 'John','Tom' -- doesn't work - expects two variables
exec getSomething "'John','Tom'" -- doesn't work - doesn't find anything
exec getSomething '"John","Tom"' -- doesn't work - doesn't find anything
exec getSomething '\'John\',\'Tom\'' -- doesn't work - syntax error
Run Code Online (Sandbox Code Playgroud)
编辑:我实际上发现这个页面有很好的参考,可以将数组传递给sproc
我正在研究sybase ASE 15.寻找类似这样的东西
Select * into #tmp exec my_stp;
Run Code Online (Sandbox Code Playgroud)
my_stp返回10个数据行,每行有两列.
如果要在存储过程中创建临时表并希望在其上添加一个或两个索引,以提高针对它的任何其他语句的性能,最佳方法是什么?SYBASE说这个:
"创建索引时,表必须包含数据.如果创建临时表并在空表上创建索引,Adaptive Server不会创建列统计信息(如直方图和密度).如果在创建索引后插入数据行,优化器的统计数据不完整."
但是最近一位同事提到,如果我在不同的存储过程中创建临时表和索引到实际使用临时表的那个,那么Adaptive Server优化器将能够使用它们.
总的来说,我不是那些增加价值的包装程序的忠实粉丝,所以我实际上并没有去测试这个,但我想我会把问题放在那里,看看是否还有其他任何人方法或建议?
好的,所以Sybase(12.5.4)将允许我执行以下操作以DROP表(如果它已经存在):
IF EXISTS (
SELECT 1
FROM sysobjects
WHERE name = 'a_table'
AND type = 'U'
)
DROP TABLE a_table
GO
Run Code Online (Sandbox Code Playgroud)
但是,如果我尝试对表创建执行相同操作,我总是会收到警告,表已经存在,因为它继续并尝试创建我的表并忽略条件语句.试试两次运行以下语句,你会明白我的意思:
IF NOT EXISTS (
SELECT 1
FROM sysobjects
WHERE name = 'a_table'
AND type = 'U'
)
CREATE TABLE a_table (
col1 int not null,
col2 int null
)
GO
Run Code Online (Sandbox Code Playgroud)
运行以上错误会产生以下错误:
SQL Server错误(localhost)错误:2714 at Line:7消息:数据库中已存在名为"a_table"的对象.
这有什么用??!
如果在proc中某处出现文本字符串,如何在Sybase数据库中找到存储过程?我想看看db中的任何其他proc是否与我正在查看的那个有相似的逻辑,我想我有一个非常独特的搜索字符串(字面值)
编辑:
我正在使用Sybase版本11.2
我正在编写一个应用程序来将数据从Oracle移动到Sybase,并且需要执行更新/插入操作.在Oracle中,我使用MERGE INTO,但它似乎在Sybase中不可用(无论如何都不在ASE中).我知道这可以用多个语句完成,但由于几个原因,我真的想把它变成一个语句.
有什么建议?
1.有没有人成功地将c#中的ODBC用于Sybase ASE?
2.或者更好,有没有人成功地将Sybase ASE与.NET Core一起使用?
我使用的是.NET Core 1.1,当前的Sybase.AdoNet4.AseClient.dll不起作用,因此我尝试使用ODBC.我试过使用两个ODBC包:
两者都适用于内联查询,并且两者都可以很好地调用没有参数的Sybase存储过程但在尝试将参数发送到需要参数的sp时都具有相同的确切错误.
这是一个片段:
command.CommandType = CommandType.StoredProcedure;
command.CommandText = "XX_GetLookUp";
command.Parameters.Add("@Type", OdbcType.VarChar).Value = "ACC";
using (var reader = command.ExecuteReader()) {
...
}
Run Code Online (Sandbox Code Playgroud)
我在命令期间不断收到以下错误.ExecuteReader(): System.Data.Odbc.OdbcException:'ERROR [ZZZZZ] [SAP] [ASE ODBC驱动程序] [Adaptive Server Enterprise]过程iKYC_GetLookUp需要参数@Type,这不是提供.
我试图使用带有和没有@的Type但每个都生成相同的错误.
我也尝试了其他几种口味:
上面每个生成的位置:System.Runtime.InteropServices.SEHException:'外部组件抛出异常.'
我也尝试将参数对象分开构建,没有运气(同样的错误,缺少@Type):
OdbcParameter p = new OdbcParameter();
p.ParameterName = "@Type";
p.DbType = DbType.AnsiString;
p.Direction = …Run Code Online (Sandbox Code Playgroud) 在使用Sybase 12.5驱动程序的SQL Server 2008中,一切正常,但现在我们已经使用64位驱动程序迁移到SQL Server 2012和Sybase 15,似乎事情已经破裂.
如果我测试链接服务器连接它给我链接服务器成功的消息但是当我在视觉上深入查看目录虽然它列出了所有这些目录,但它们显示为空白如此

但项目计数是正确的,因为我们在Sybase中有许多目录.我认识到的另一个有趣的事情是,当我执行和OPENQUERY时,它给了我正确的行数,但仍显示空字符串,如此

我不知道这里发生了什么,我唯一的线索是当我在这些空白数据库中深入查看时出现此错误消息.此异常提示.

Failed to retrieve data for this request. (Microsoft.SqlServer.Management.Sdk.Sfc)
------------------------------
ADDITIONAL INFORMATION:
An exception occurred while executing a Transact-SQL statement or batch. (Microsoft.SqlServer.ConnectionInfo)
------------------------------
Cannot obtain the schema rowset "DBSCHEMA_TABLES" for OLE DB provider "MSDASQL" for linked server "TEST". The provider supports the interface, but returns a failure code when it is used. (Microsoft SQL Server, Error: 7311)
Run Code Online (Sandbox Code Playgroud)
任何想法为什么会这样?有谁知道解决这个问题?
sybase-ase ×10
sql ×3
t-sql ×2
asp.net ×1
asp.net-core ×1
conditional ×1
ddl ×1
indexing ×1
isql ×1
metadata ×1
odbc ×1
sql-server ×1
sybase ×1
temp-tables ×1
upsert ×1
version ×1