2010-09-08 13 views
12

me encontré con un problema de compatibilidad de hoy, como un cliente actualizado desde Windows XP a Windows 7.SQL Server: ¿Por qué debería agregar "; 1" al final de un nombre de procedimiento almacenado?

El (código 12 años de edad) está llamando a un procedimiento almacenado en el servidor SQL Server llama

ai_nextid 

Excepto que cuando se llama al procedimiento almacenado que está utilizando el nombre:

ai_nextid;1 

Sí, con un ";1" adjuntas. Al parecer, el controlador de SQL Server en Windows 95, Windows 2000, Windows XP y posiblemente Windows Vista están bien con este específicamente sufijo agregado. Sin embargo, el controlador de SQL Server en Windows 7 es diferente, y provoca el error:

General SQL Error.
[Microsoft][ODBC SQL Driver][SQL Server]Could not find stored procedure 'ai_nextid;1'.
[Microsoft][ODBC SQL Driver][SQL Server]Indicator variable requried but not supplied'.

Con error nativo 2812.

Esto nos lleva a 4 preguntas:

  • por qué nos anexar ;1 al final del nombre del procedimiento almacenado? (¿Qué logra)
  • ¿por qué el controlador de SQL Server lo ignoraba?
  • ¿por qué se hizo un cambio radical en Windows 7?
  • ¿Está documentado el cambio de compatibilidad de última hora?

Las dos últimas preguntas probablemente serían las mismas, ya que si lo documentan, lo justificarían.

+10

Esa es la sintaxis para [numerada procedimientos almacenados] (http://jagbarcelo.blogspot.com/2006/09/numbered-stored-procedures-will-be.html). ¿Sus procedimientos almacenados están realmente numerados o '' 1 '' tal vez simplemente de manera predeterminada a la versión no numerada? –

+1

Whaddayaknow. El procedimiento almacenado en realidad se declara como 'CREATE PROCEDURE ai_nextid; 1 ...'. ¿Quien sabe? –

+0

si todos solo usan '; 1', usted puede simplemente escribir todos los procedimientos en un solo archivo y luego buscar reemplazar'; 1' con una cadena vacía. Ejecute esa secuencia de comandos y realice la misma búsqueda/reemplazo en la aplicación que llama a los procedimientos almacenados. –

Respuesta

13

ver 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 ] 

;number

An optional integer that is used to group procedures of the same name. These grouped procedures can be dropped together by using one DROP PROCEDURE statement.

Note:

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. 

Numbered procedures cannot use the xml or CLR user-defined types and cannot be used in a plan guide.

Puede utilizar esta vista del sistema para encontrar todo esto y comenzar a reescribir como procedimientos separados:

sys.numbered_procedures (Transact-SQL)

+0

Lo que es confuso es que todo eso cambió en las máquinas del cliente; actualizado a Windows 7. Por lo tanto, la función todavía existe * en el servidor *, pero se ha eliminado del controlador del cliente. –

6
  • ¿Por qué nosotros anexando; 1 al final del nombre del procedimiento almacenado? (¿Qué logra?)

;; 1 significa que llama a procedimientos almacenados numerados. Puede tener InsertOrders;1, InsertOrders;2, InsertOrders;3 como versiones diferentes con el mismo nombre. Cuando realiza un DROP en InsertOrders, se descartan todas las versiones numeradas. Esta fue la implementación de sobrecarga de un hombre pobre.

  • ¿por qué el controlador de SQL Server lo ignoraba?

El antiguo controlador de SQL Server sabía lo que era un proceso numerado, o no lo suficientemente inteligente como para analizar y compilar esa parte del código.

  • ¿por qué fue un cambio radical en Windows 7?

  • ¿está documentado el cambio de compatibilidad de última hora?

Esto no se admitirá en una versión futura, pero R2 admite procesos almacenados numerados. Personalmente nunca puse procs numerados en producción, solo jugué con ellos, dije "oh genial" y seguí adelante.

0

I tenían el mismo problema, hasta añadí algo de código, para eliminar el "; 1" si todavía estaba en el extremo de la 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; 
Cuestiones relacionadas