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

Ian*_*oyd 12 sql-server delphi compatibility stored-procedures windows-7

当我从Windows XP升级到Windows 7时,我遇到了兼容性问题.

(12岁的代码)正在调用SQL Server上的存储过程

ai_nextid
Run Code Online (Sandbox Code Playgroud)

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

ai_nextid;1
Run Code Online (Sandbox Code Playgroud)

是的,;1附加了" ".显然,Windows 95,Windows 2000,Windows XP以及可能的Windows Vista中的SQL Server驱动程序可以使用此特定添加的后缀.但Windows 7中的SQL Server ODBC驱动程序不同,并导致错误:

一般SQL错误.
[Microsoft] [ODBC SQL驱动程序] [SQL Server]找不到存储过程'ai_nextid; 1'.
[Microsoft] [ODBC SQL驱动程序] [SQL Server]指标变量需要但未提供'.

原生错误2812.

这带来了4个问题:

  • 为什么我们追加;1到存储过程名称的末尾?(它完成了什么)
  • 为什么SQL Server驱动程序忽略它?
  • 为什么在Windows 7中进行了重大改变?
  • 记录的破坏兼容性变化是什么?

最后两个问题可能是相同的,因为如果他们记录下来,他们就会证明这一点.

KM.*_*KM. 13

请参阅CREATE PROCEDURE(Transact-SQL)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 ]
Run Code Online (Sandbox Code Playgroud)

;数

一个可选的整数,用于对同名的过程进行分组.可以使用一个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.
Run Code Online (Sandbox Code Playgroud)

编号过程不能使用xml或CLR用户定义类型,也不能在计划指南中使用.

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

sys.numbered_procedures(Transact-SQL)


Raj*_*ore 6

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

; 1表示您正在调用编号存储过程.你可以有InsertOrders;1,InsertOrders;2,InsertOrders;3不同版本具有相同的名称.在InsertOrders上执行DROP时,将删除所有编号的版本.这是一个穷人实施的超载.

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

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

  • 为什么在Windows 7中进行了重大改变?

  • 记录的破坏兼容性变化是什么?

在将来的版本中不支持此功能,但R2支持编号存储过程.我个人从未将编号的过程投入生产 - 只与他们一起玩,说"哦很酷"并继续前进.