语法错误:通用插入的存储过程

时间:2009-01-19 10:28:30

标签: sql-server visual-studio sql-server-2005 stored-procedures

我有问题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字段的记录。

有关如何做到这一点的任何建议。

4 个答案:

答案 0 :(得分:3)

选择:

  • @TableName未定义
  • @tblName@TableName

答案 1 :(得分:2)

我无法立即看到语法(the sharp eye of Jonathan Lonowski has solved that already)有什么问题,但代码有些问题:

  1. 您可以创建动态SQL,因此您的代码可以适应SQL注入攻击。两个输入参数都以危险的方式使用。通过为每个表创建存储过程来解决此问题。所以你不必再生成SQL了。

  2. 不检查表格是否在使用的列表中。

  3. 您的主键生成算法可以/将在多用户方案中创建重复键,或者是否从表中删除行。使用您正在使用的数据库中的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获得更多。