首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Server:为什么我要在存储过程名称的末尾添加";1“?

Server:为什么我要在存储过程名称的末尾添加";1“?
EN

Stack Overflow用户
提问于 2010-09-08 19:33:00
回答 3查看 4.6K关注 0票数 14

今天我遇到了一个兼容性问题,因为一个客户从Windows升级到了Windows 7。

(12年前的代码)正在调用SQL Server上的一个存储过程

代码语言:javascript
运行
复制
ai_nextid

但是,当它调用存储过程时,它使用的名称是:

代码语言:javascript
运行
复制
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?(它实现了什么)
  • 为什么Server驱动程序忽略它?
  • 为什么Windows 7中发生了重大变化?
  • 是否记录了破坏兼容性的更改?

最后两个问题可能是一样的,因为如果他们把它记录下来,就会证明是合理的。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-09-08 19:43:55

请参阅创建过程(Transact- SQL ) Server 2008文档

代码语言:javascript
运行
复制
--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)

票数 13
EN

Stack Overflow用户

发布于 2010-09-08 19:50:21

  • 为什么我们要附加;1到存储过程名称的末尾?(它实现了什么)

;1表示您正在调用编号存储过程。您可以将InsertOrders;1InsertOrders;2InsertOrders;3作为同名的不同版本。当您删除InsertOrders时,所有编号的版本都会被删除。这是一个穷人实施的过载。

  • 为什么Server驱动程序忽略它?

旧的Server驱动程序要么知道什么是编号的proc,要么没有足够的智能来解析和编译这部分代码。

  • 为什么Windows 7中发生了重大变化?
  • 是否记录了破坏兼容性的更改?

在将来的版本中将不支持这一点,但是R2支持编号存储过程。我个人从来没有把编号的程序在生产中-只与他们玩,说“哦酷”,并继续前进。

票数 6
EN

Stack Overflow用户

发布于 2012-08-21 12:23:55

在添加了一些代码之前,我也遇到了同样的问题,如果";1“还在StoredProcName的末尾,则删除它:

代码语言:javascript
运行
复制
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;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3671270

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档