2010-12-14 86 views
0

J'ai écrit ce SP très simple dans SQL 2008:la fonction max nécessite 1 argument (s)

Create procedure dbo.GetNextID 
(
    @TableName nvarchar(50), 
    @FieldName nvarchar(50) 
) 
AS 
    BEGIN 
     exec('select isnull(max('[email protected]+'),0)+1 as NewGeneratedID from '+ @TableName); 
    END 

Lorsque j'exécute cette procédure Visual Studio SQL Express et passer un nom de table et un nom de domaine, il fonctionne très bien. Mais lorsque je tente d'ajouter ce SP comme une requête dans un QueryTableAdapter dans mon ADO DataSet, je reçois cette erreur avant de cliquer sur le bouton Finish:

the max function requires 1 argument(s)

quelqu'un peut me aider?

Répondre

1

Je suppose que VS essaie de déterminer une liste de champs en exécutant le SP. Mais comme il ne sait pas quoi passer au SP, il utilise des paramètres vides. Maintenant, bien sûr, votre instruction select échoue.

Vous pouvez essayer d'ajouter ce qui suit à votre SP:

IF ISNULL(@TableName,'') = '' SET @TableName = '<Name of a test table>'; 
IF ISNULL(@FieldName,'') = '' SET @FieldName = '<Name of some field>'; 

Utilisez les noms de certains champs et de tables qui existent ici (par exemple les noms que vous souhaitez utiliser dans votre application, aussi).

vous pourriez aussi ajouter ce qui suit au-dessus du exec:

IF (ISNULL(@TableName, '') = '') OR (ISNULL(@FieldName, '') = '') 
BEGIN 
    SELECT -1 AS NewGeneratedId 
    RETURN 0 
END 

EDIT
Sur une note côté, je voudrais vous mettre en garde contre les problèmes de concurrence que je vois à venir de ce que votre code Est-ce que. Si ce code est supposé renvoyer un identifiant unique pour un nouvel enregistrement dans une table, je le reconce comme suit:

Créer une table NumberSeries où chaque ligne contient un nom unique, une plage possible pour les ID et le courant Valeur d'ID.

Créez une procédure stockée qui utilise UPDATE ... OUTPUT pour mettre à jour l'ID actuel d'une série numérique et l'extraire en une seule étape. De cette façon, vous pouvez vous assurer que la création d'un nouvel ID est une opération unique qui ne provoque pas de problèmes de simultanéité.

+0

Merci beaucoup, j'ai utilisé votre première idée et ça marche! sur l'utilisation d'une table pour les problèmes de concurrence, je dois dire que c'est une bonne idée aussi, mais dans mon projet actuel, il n'y a qu'un seul utilisateur qui entre les données ... de toute façon, vraiment merci .. –