Синтаксическая ошибка: хранимая процедура для универсальной вставки

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

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 ... но мне нужно использовать AlphaNumeric ID в таблицах при вставке новых значений в многопользовательской системе интрасети.

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

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

Какая проблема? Какую ошибку вы получаете? Где?

lc. 19.01.2009 13:35

Вы действительно читать сообщений об ошибках, которые вы получаете при попытке запустить это? Мне это кажется результатом копирования двух процедур вместе без какого-либо представления о SQL. Требуется минимальное количество собственных усилий, иначе люди обидятся на ваш вопрос.

Tomalak 19.01.2009 13:40
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
869
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Сделайте ваш выбор:

  • @TableName не определен
  • @tblName против @TableName

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

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

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

привет, где мне поставить точку с запятой. я только начал с sql server. Я не встречал хорошего материала для изучения эффективных методов и синтаксиса хранимых процедур.

kk. 19.01.2009 13:41
Ответ принят как подходящий

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

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

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

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

MSDN - это всегда хорошее место для начала, когда вы занимаетесь разработкой для MS. И постарайтесь, чтобы ваш код был более простым, вы пытаетесь сделать слишком много в одном месте.

GvS 19.01.2009 13:47

Проголосовали за попытку ответить на вопрос положительно.

Raithlin 19.01.2009 13:51

Честно говоря, вы, кажется, устраиваете себе головную боль. Проверьте целочисленные идентификаторы и Синтаксис 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 |

Другие вопросы по теме