У меня проблема с компиляцией этого кода ... может ли кто-нибудь сказать, что не так с синтаксисом
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 в таблицах при вставке новых значений в многопользовательской системе интрасети.
Записи не будут удалены из таблицы. Таким образом, проблема заключается в том, чтобы поддерживать синхронную вставку записей с автоматически сгенерированным полем идентификатора.
Любые предложения, как это можно сделать.
Вы действительно читать сообщений об ошибках, которые вы получаете при попытке запустить это? Мне это кажется результатом копирования двух процедур вместе без какого-либо представления о SQL. Требуется минимальное количество собственных усилий, иначе люди обидятся на ваш вопрос.





Сделайте ваш выбор:
@TableName не определен@tblName против @TableNameПомимо пропуска множества точек с запятой, вам придется дать нам больше, чтобы продолжить.
На самом деле, SQL Server может не нуждаться в точках с запятой, поэтому игнорируйте это ...
Но здесь - хорошее место для начала изучения хранимых процедур в SQL-сервере. Вы можете также использовать поиск в Google для некоторых других.
привет, где мне поставить точку с запятой. я только начал с sql server. Я не встречал хорошего материала для изучения эффективных методов и синтаксиса хранимых процедур.
Я не могу сразу понять, что не так с синтаксисом (острый глаз Джонатана Лоновски решил, что уже), но есть некоторые ошибки с кодом:
Вы создаете динамический SQL, поэтому ваш код уязвим для атак с использованием SQL-инъекций. Оба входных параметра используются опасным образом. Решите эту проблему, создав хранимую процедуру для каждой таблицы. Таким образом, вам больше не нужно генерировать SQL.
Нет проверки, нет ли таблицы в используемом списке.
Ваш алгоритм генерации первичного ключа может / будет создавать повторяющиеся ключи в многопользовательском сценарии или при удалении строк из таблицы. Решите, используя столбец личность или какая-то другая особенность из базы данных, которую вы используете.
MSDN - это всегда хорошее место для начала, когда вы занимаетесь разработкой для MS. И постарайтесь, чтобы ваш код был более простым, вы пытаетесь сделать слишком много в одном месте.
Проголосовали за попытку ответить на вопрос положительно.
Честно говоря, вы, кажется, устраиваете себе головную боль. Проверьте целочисленные идентификаторы и Синтаксис 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 |
Какая проблема? Какую ошибку вы получаете? Где?