0

我有问题compilin这code..can谁能告诉什么是错的语法语法错误:存储过程一般插入

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 

我知道整数标识列..但我必须使用在高度多用户的Intranet系统中插入新值的表中的AlphaNumeric ID。

记录不会从表格中删除。所以问题在于保持同步插入带ID字段的记录自动生成。

任何建议如何做到这一点。

+0

什么问题?你遇到了什么错误?哪里? – 2009-01-19 10:35:01

+0

您是否真的*读过*您尝试运行时收到的错误消息?对我来说,似乎是将两个程序复制粘贴在一起,而无需任何有关SQL的线索。需要少量自己的努力,否则人们会因为你的问题而感到不高兴。 – Tomalak 2009-01-19 10:40:23

回答

2

我不能立即看到什么是错的语法(the sharp eye of Jonathan Lonowski has solved that already),但也有一些事情错代码:

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

  2. 没有检查表是否不在所使用的列表中。

  3. 您的主键生成算法可以/将在多用户场景中创建重复键,或者如果从表中删除行。通过使用您正在使用的数据库中的identity列或some other feature来解决。

3

任你选:不定义

  • @TableName
  • @tblName@TableName
0
从丢失大量的分号

除此之外,你将不得不给我们更多的要继续。

事实上,SQL Server可能不需要分号,所以忽视...

here是开始学习有关SQL Server存储prcedures的好地方。您也可以更多地使用search Google

+0

hi 我必须在哪里放分号。我刚刚开始使用SQL Server。我还没有遇到好的材料来学习有效的存储过程技术和语法。 – 2009-01-19 10:41:07

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 |