代码之家  ›  专栏  ›  技术社区  ›  Ian Boyd

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

  •  12
  • Ian Boyd  · 技术社区  · 14 年前

    (12年前的代码)正在调用SQL Server上名为

    ai_nextid
    

    除了调用存储过程时使用的名称:

    ai_nextid;1
    

    是的,有一个“ ;1 ”追加。显然,Windows95、Windows2000、WindowsXP,甚至WindowsVista中的SQLServer驱动程序都可以使用 添加了后缀。但是Windows 7中的SQL Server ODBC驱动程序不同,并导致错误:


    [Microsoft][ODBC SQL Driver][SQL Server]找不到存储过程“ai\u nextid;1”。
    需要[Microsoft][ODBC SQL Driver][SQL Server]指标变量,但未提供'。

    带有本机错误 2812 .

    这带来了4个问题:

    • ;1
    • 为什么SQL Server驱动程序会忽略它?
    • 为什么Windows7会有突破性的改变?
    • 是否记录了破坏性兼容性更改?

    最后两个问题可能是相同的,因为如果他们记录下来,他们会证明这是正确的。

    3 回复  |  直到 14 年前
        1
  •  13
  •   KM.    14 年前

    CREATE PROCEDURE (Transact-SQL) SQL Server 2008 documentation

    --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 PROCEDURE语句,可以将这些分组的过程放在一起。

    注:

    This feature will be removed in a future version of Microsoft SQL Server.
        Avoid using this feature in new development work, and plan to
        modify applications that currently use this feature.
    

    编号过程不能使用xml或CLR用户定义的类型和 不能在计划指南中使用。

    您可以使用此系统视图查找所有这些,并开始将它们作为单独的过程重写:

    sys.numbered_procedures (Transact-SQL)

        2
  •  6
  •   Raj More    14 年前
    • 为什么要在存储过程名称的末尾附加;1?(它完成了什么)

    1表示您正在调用编号的存储过程。你可以有 InsertOrders;1 , InsertOrders;2 , InsertOrders;3

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

    旧的SQL Server驱动程序要么知道什么是带编号的过程,要么不够聪明,无法解析和编译这部分代码。

    • 为什么Windows7会有突破性的改变?

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

        3
  •  0
  •   Brian Webster Jason    12 年前

    我也遇到了同样的问题,直到我添加了一些代码,如果“;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;