Подтвердить что ты не робот

SQL Server: Почему я должен добавить "; 1" в конец имени хранимой процедуры?

Сегодня я столкнулся с проблемой совместимости, поскольку клиент обновлен с Windows XP до Windows 7.

(12-летний код) вызывает хранимую процедуру на SQL Server под названием

ai_nextid

Кроме того, когда он вызывает хранимую процедуру, он использует имя:

ai_nextid;1

Да, с добавленным ";1". Очевидно, что драйвер SQL Server в Windows 95, Windows 2000, Windows XP и, возможно, Windows Vista отлично справляется с этим добавленным суффиксом специально. Но драйвер ODBC SQL Server в Windows 7 отличается и вызывает ошибку:

Общая ошибка SQL.
[Microsoft] [драйвер SQL ODBC] [SQL Server] Не удалось найти хранимую процедуру "ai_nextid; 1".
[Microsoft] [Драйвер SQL ODBC] [SQL Server] Изменена переменная индикатора, но не указана.

С собственной ошибкой 2812.

Это вызывает 4 вопроса:

  • Почему мы добавляли ;1 в конец имени хранимой процедуры? (что он делает)
  • Почему драйвер SQL Server игнорировал его?
  • Почему в Windows 7 произошли серьезные изменения?
  • является документированным нарушением совместимости?

Последние два вопроса, вероятно, будут одинаковыми, поскольку, если они документируют это, они оправдывают его.

4b9b3361

Ответ 1

см. 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 ]

число

Необязательное целое число, которое используется для группировки процедур с тем же именем. Эти сгруппированные процедуры можно сбрасывать вместе, используя один оператор 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

  • почему мы добавляем: 1 до конца имени хранимой процедуры? (что он делает)

The; 1 означает, что вы вызываете Numbered Stored Procedures. Вы можете иметь InsertOrders;1, InsertOrders;2, InsertOrders;3 как разные версии с тем же именем. Когда вы делаете DROP на InsertOrders, все нумерованные версии удаляются. Это была неудачная реализация перегрузки.

  • Почему драйвер SQL Server игнорировал его?

Старый драйвер SQL Server либо знал, что пронумерованный proc был, либо недостаточно умен, чтобы разобрать и скомпилировать эту часть кода.

  • Почему в Windows 7 произошло нарушение?

  • Записывается ли нарушение совместимости?

Это не будет поддерживаться в будущей версии, но R2 поддерживает пронумерованные хранимые процедуры. Я лично никогда не ставил пронумерованные procs в производство - только играл с ними, сказал "о, круто" и двинулся дальше.

Ответ 3

У меня была такая же проблема, пока я не добавил код, чтобы удалить "; 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;