Синтаксическая ошибка: хранимая процедура для универсальной вставки - PullRequest
0 голосов
/ 19 января 2009

У меня проблема с компиляцией этого кода .. кто-нибудь может сказать, что не так с синтаксисом

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

Я знаю о столбцах Integer Identity ... но мне нужно использовать буквенно-цифровой идентификатор в таблицах при вставке новых значений в многопользовательскую интрасеть

Записи не будут удалены из таблицы. Таким образом, проблема заключается в поддержании синхронной вставки записей с автоматически генерируемым полем ID.

Любые предложения, как это можно сделать.

Ответы [ 4 ]

3 голосов
/ 19 января 2009

Выберите:

  • @TableName не определено
  • @tblName против @TableName
2 голосов
/ 19 января 2009

Я не могу сразу увидеть, что не так с синтаксисом ( острый глаз Джонатана Лоновски решил, что уже ), но есть некоторые проблемы с кодом:

  1. Вы создаете динамический SQL, поэтому ваш код уязвим для атак с использованием SQL-инъекций. Оба входных параметра используются опасным образом. Решите это, создав хранимую процедуру для каждой таблицы. Поэтому вам больше не нужно генерировать SQL.

  2. Нет проверки, если таблицы нет в используемом списке.

  3. Ваш алгоритм генерации первичного ключа может / будет создавать дубликаты ключей в многопользовательском сценарии или при удалении строк из таблицы. Решите, используя идентификатор столбец или некоторые другие функции из базы данных, которую вы используете.

1 голос
/ 19 января 2009

Честно говоря, вы, кажется, делаете головную боль для себя. Проверьте целочисленные тождества и IDENTITY синтаксис .

Если вы действительно обязаны использовать ключи в формате "DEF_00005", они сделают вашу жизнь намного проще.

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 |
0 голосов
/ 19 января 2009

Помимо пропущенного множества точек с запятой, вам придется дать нам больше, чтобы продолжить.

На самом деле SQL Server может не понадобиться точка с запятой, поэтому игнорируйте это ...

Но здесь - хорошее место для начала изучения хранимых prcedures в SQL-сервере. Вы также можете искать в Google и другие.

...