2010-09-08 15 views
12

mi sono imbattuto in un problema di compatibilità di oggi, come un cliente aggiornato da Windows XP a Windows 7.SQL Server: Perché dovrei aggiungere "; 1" alla fine di un nome di stored procedure?

L'(12 anni vecchio codice) sta chiamando una stored procedure di SQL Server chiamato

ai_nextid 

Tranne che quando si chiama la stored procedure che sta usando il nome:

ai_nextid;1 

Sì, con un ";1" aggiunto. A quanto pare il driver di SQL Server in Windows 95, Windows 2000, Windows XP e Windows Vista, eventualmente, sono bene con questo specificamente aggiunto il suffisso. Ma il driver ODBC di SQL Server in Windows 7 è diverso, e causa l'errore:

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 errore nativo 2812.

Questo porta 4 domande:

  • perché stavamo aggiungendo ;1 alla fine del nome della stored procedure? (Cosa vuol realizzare)
  • il motivo per cui è stato il driver di SQL Server ignorarlo?
  • perché è stata apportata una modifica di interruzione in Windows 7?
  • è documentato il cambiamento compatibilità di rottura?

Le ultime due domande sarebbero probabilmente le stesse, poiché se lo documentassero, lo giustificherebbero.

+10

Questa è la sintassi per [numerati stored procedure] (http://jagbarcelo.blogspot.com/2006/09/numbered-stored-procedures-will-be.html). Le tue stored procedure sono effettivamente numerate o "1", forse è solo l'impostazione predefinita per la versione non numerata? –

+1

Whaddayaknow. La stored procedure in realtà è dichiarata come 'CREATE PROCEDURE ai_nextid; 1 ...'. Chi lo sapeva? –

+0

se usano tutti solo '; 1' si possono semplicemente scrivere tutte le procedure in un singolo file e quindi cercare sostituire'; 1' con una stringa vuota. Esegui lo script fie e fai la stessa ricerca/sostituzione nell'applicazione che chiama le stored procedure. –

risposta

13

vedere 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.

È possibile utilizzare questa vista di sistema per trovare tutti questi e cominciare a riscrivere loro come procedure separate:

sys.numbered_procedures (Transact-SQL)

+0

La confusione è che tutto ciò che è cambiato nelle macchine client; aggiornato a Windows 7. Quindi la funzione esiste ancora * sul server * - ma è stata rimossa dal driver client. –

6
  • perché erano siamo in aggiunta: 1 alla fine del nome della stored procedure? (Quello che fa compiere)

L'; 1 significa che si sta chiamando stored procedure numerate. È possibile avere InsertOrders;1, InsertOrders;2, InsertOrders;3 come versioni diverse con lo stesso nome. Quando si esegue un DROP su InsertOrders, tutte le versioni numerate vengono eliminate. Questa era l'implementazione del sovraccarico da parte di un uomo povero.

  • perché il driver di SQL Server lo ha ignorato?

Il vecchio driver di SQL Server sapeva che cosa era un proc numerato o non era abbastanza intelligente da analizzare e compilare quella porzione di codice.

  • perché è stata apportata una modifica in Windows 7?

  • è la modifica della compatibilità di rottura documentata?

Questo non sarà supportato in una versione futura, ma R2 supporta proc memorizzati numerati. Personalmente non ho mai messo in produzione proc in serie - ho suonato solo con loro, ho detto "oh cool" e ho proseguito.

0

Ho avuto lo stesso problema, fino a quando ho aggiunto un po 'di codice, per rimuovere il "; 1" se era ancora alla fine del 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;