我有问题compilin这个代码..任何人都可以告诉语法错误
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在高度多用户的Intranet系统中插入新值。
不会从表中删除记录。因此,问题在于保持同步插入具有自动生成ID字段的记录。
有关如何做到这一点的任何建议。
答案 0 :(得分:3)
选择:
@TableName
未定义@tblName
与@TableName
答案 1 :(得分:2)
我无法立即看到语法(the sharp eye of Jonathan Lonowski has solved that already)有什么问题,但代码有些问题:
您可以创建动态SQL,因此您的代码可以适应SQL注入攻击。两个输入参数都以危险的方式使用。通过为每个表创建存储过程来解决此问题。所以你不必再生成SQL了。
不检查表格是否在使用的列表中。
您的主键生成算法可以/将在多用户方案中创建重复键,或者是否从表中删除行。使用您正在使用的数据库中的identity列或some other feature进行解决。
答案 2 :(得分:1)
老实说,你似乎为自己头疼。查看整数标识和IDENTITY
syntax。
除非您真正 使用“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 |
答案 3 :(得分:0)
除了缺少许多分号之外,你还需要给我们更多的东西。
实际上,SQL Server可能不需要分号,因此请忽略它......
但是here是开始学习SQL服务器中存储的prcedures的好地方。你也可以search Google获得更多。