今天我遇到了一个兼容性问题,因为一个客户从Windows升级到了Windows 7。
(12年前的代码)正在调用SQL Server上的一个存储过程
ai_nextid
但是,当它调用存储过程时,它使用的名称是:
ai_nextid;1
是的,附加了一个";1
“。显然,Windows 95、Windows 2000、Windows以及可能的Windows中的Server驱动程序对此(特别是添加的后缀)没有问题。但是Windows 7中的SQL Server ODBC驱动程序是不同的,并导致错误:
一般SQL错误。 MicrosoftSQL ServerCould找不到存储过程‘ai_ServerCould;1’。 MicrosoftSQL ServerIndicator变量已调整但未提供‘。
带有本机错误二八一二。
这就引出了四个问题:
;1
?(它实现了什么)最后两个问题可能是一样的,因为如果他们把它记录下来,就会证明是合理的。
发布于 2010-09-08 19:43:55
请参阅创建过程(Transact- SQL ) Server 2008文档
--Transact-SQL Stored Procedure Syntax
CREATE { PROC | PROCEDURE } [schema_name.] procedure_name [ ; number ] <<<<<<
[ { @parameter [ type_schema_name. ] data_type }
[ VARYING ] [ = default ] [ OUT | OUTPUT ] [READONLY]
] [ ,...n ]
[ WITH <procedure_option> [ ,...n ] ]
[ FOR REPLICATION ]
AS { [ BEGIN ] sql_statement [;] [ ...n ] [ END ] }
[;]
<procedure_option> ::=
[ ENCRYPTION ]
[ RECOMPILE ]
[ EXECUTE AS Clause ]
;数目 一个可选整数,用于对同名的过程进行分组。可以使用一条DROP过程语句将这些分组过程放在一起。 注意:此功能将在Microsoft SQL Server的未来版本中删除。避免在新的开发工作中使用此功能,并计划修改当前使用此功能的应用程序。 编号的过程不能使用xml或CLR用户定义的类型,也不能在计划指南中使用。
您可以使用此系统视图查找所有这些,并开始将它们重写为单独的过程:
过程(Transact-SQL)
发布于 2010-09-08 19:50:21
;1表示您正在调用编号存储过程。您可以将InsertOrders;1
、InsertOrders;2
、InsertOrders;3
作为同名的不同版本。当您删除InsertOrders时,所有编号的版本都会被删除。这是一个穷人实施的过载。
旧的Server驱动程序要么知道什么是编号的proc,要么没有足够的智能来解析和编译这部分代码。
在将来的版本中将不支持这一点,但是R2支持编号存储过程。我个人从来没有把编号的程序在生产中-只与他们玩,说“哦酷”,并继续前进。
发布于 2012-08-21 12:23:55
在添加了一些代码之前,我也遇到了同样的问题,如果";1“还在StoredProcName的末尾,则删除它:
strProcName := StoredProc.StoredProcName;
IF (length(strProcName) > 2) AND (copy(strProcName, length(strProcName) - 1, 2) = ';1') THEN
BEGIN
delete(strProcName, length(strProcName) - 1, 2);
StoredProc.StoredProcName := strProcName;
END {IF};
StoredProc.Prepare;
StoredProc.ParamByName('@cntid').AsInteger := nCounterID;
StoredProc.ParamByName('@range').AsInteger := nRange;
StoredProc.ExecProc;
result := StoredProc.ParamByName('@Status').AsInteger;
https://stackoverflow.com/questions/3671270
复制相似问题