0

je compilin problème ce quelqu'un code..can dire ce qui est erroné avec la syntaxeErreur de syntaxe: procédure stockée pour générique Insérer

CREATE PROCEDURE spGenericInsert 
    (
     @insValueStr nvarchar(200) 
     @tblName nvarchar(10) 
    ) 

AS 

BEGIN 

    DECLARE @insQueryStr nvarchar(400) 
    DECLARE @insPrimaryKey nvarchar(10) 
    DECLARE @rowCountVal integer 
    DECLARE @prefix nvarchar(5) 


    IF @tblName='HW_Master_DB' 
     SET @rowCountVal=(SELECT COUNT(*) FROM HW_Master_DB) 
    ELSE IF @TableName='SW_Master_DB' 
     SET @rowCountVal=(SELECT COUNT(*) FROM SW_Master_DB) 
    ELSE IF @TableName='INV_Allocation_DB' 
     SET @rowCountVal=(SELECT COUNT(*) FROM INV_Allocation_DB) 
    ELSE IF @TableName='REQ_Master_DB' 
     SET @rowCountVal=(SELECT COUNT(*) FROM REQ_Master_DB) 

    IF @tblName = 'DEFECT_LOG' 
     SET @prefix='DEF_' 
    ELSE IF @tblName='INV_Allocation_DB' 
     SET @prefix='INV_' 
    ELSE IF @tblName='REQ_Master_DB' 
     SET @prefix='REQ_' 
    ELSE IF @tblName='SW_Master_DB' 
     SET @prefix='SWI_' 
    ELSE IF @tblName='HW_Master_DB' 
     SET @prefix='HWI_' 


    SET @insPrimaryKey= @prefix + RIGHT(replicate('0',5)+ convert(varchar(5),@rowCountVal),5) -- returns somethin like 'DEF_00005' 

    SET @insQueryStr= 'INSERT INTO ' + @tblName + ' VALUES (' + @insPrimaryKey + ',' + @insValueStr + ')' 

    EXEC(@insQueryStr) 

END 

Je sais sur les colonnes Entier identité .. mais je dois utiliser un ID AlphaNumeric dans les tables en insérant de nouvelles valeurs dans un système intranet hautement multi-utilisateur.

Les enregistrements ne seront pas supprimés de la table. Le problème est donc de maintenir l'insertion synchrone des enregistrements avec le champ ID généré automatiquement.

Toutes les suggestions comment cela peut être fait.

+0

Quel problème? Quelle erreur obtenez vous? Où? –

+0

Avez-vous réellement * lu * les messages d'erreur que vous obtenez en essayant d'exécuter ceci? Pour moi, il semble que le résultat de copier-coller deux procédures ensemble sans aucune idée sur SQL que ce soit. Un minimum d'effort personnel est nécessaire, ou les gens seront offensés par votre question. – Tomalak

Répondre

2

Je ne vois pas tout de suite ce qui ne va pas avec la syntaxe (the sharp eye of Jonathan Lonowski has solved that already), mais il y a des choses qui clochent le code:

  1. Vous créez SQL dynamique, de sorte que votre code est vunerable à des attaques par injection SQL. Les deux paramètres d'entrée sont utilisés de manière dangereuse. Résolvez ceci en créant une procédure stockée pour chaque table. Vous n'avez donc plus besoin de générer du SQL.

  2. Il n'y a pas de vérification si la table n'est pas dans la liste utilisée. Votre algorithme de génération de clé primaire peut/va créer des clés dupliquées dans un scénario multi-utilisateur, ou si des lignes sont supprimées de la table. Résolvez en utilisant une colonne identity ou some other feature de la base de données que vous utilisez.

+0

comment puis-je surmonter cela .. où puis-je obtenir de bonnes informations sur les procédures stockées .. –

+0

MSDN est toujours un bon endroit pour commencer lorsque vous faites le développement de la SP. Et essayez de garder votre code plus simple, vous essayez d'en faire trop au même endroit. – GvS

+0

Voté pour essayer de répondre à la question d'une manière positive. – Raithlin

3

Faites votre choix:

  • @TableName ne définit pas
  • @tblName contre @TableName
0

En plus de manquer beaucoup de points-virgules, vous allez devoir nous donner plus à continue.

En fait, SQL Server peut-être pas besoin des points-virgules, donc ignorer que ...

Mais here est un bon endroit pour commencer à apprendre sur prcedures stockées dans le serveur SQL. Vous pouvez également en ajouter d'autres.

+0

salut où dois-je mettre des points-virgules. Je viens de commencer avec SQL Server.Je n'ai pas trouvé de bon matériel pour apprendre des techniques et des syntaxes de procédures stockées efficaces. –

1

Honnêtement, vous semblez vous faire mal à la tête. Vérifiez les identités entières et IDENTITY syntax.

Sauf si vous êtes vraiment nécessaire utiliser les touches dans le format « DEF_00005 », ils vous rendront la vie beaucoup plus facile.

CREATE TABLE DemoTable (
    Key INT IDENTITY(1,1) NOT NULL PRIMARY KEY, 
    Value VARCHAR(200) 
); 

INSERT INTO DemoTable (Value) VALUES ('Something'); 

SELECT * FROM DemoTable; 

    | Key | Value  | 
    |-----|-----------| 
    | 1 | Something | 
Questions connexes