【问题标题】:Syntax error: Stored Procedure for Generic Insert语法错误:通用插入的存储过程
【发布时间】:2009-01-19 10:28:30
【问题描述】:

我在编译这段代码时遇到问题..谁能告诉我语法有什么问题

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

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

记录不会从表中删除。所以问题是要保持记录的同步插入,并自动生成 ID 字段。

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

【问题讨论】:

  • 什么问题?你遇到了什么错误?在哪里?
  • 您是否真的阅读尝试运行此程序时收到的错误消息?对我来说,这似乎是在没有任何关于 SQL 的任何线索的情况下将两个过程复制粘贴在一起的结果。需要最少的自己的努力,否则人们会被你的问题冒犯。

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


【解决方案1】:

任你选:

  • @TableName 未定义
  • @tblName@TableName

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

    • 当您进行 MS 开发时,MSDN 总是一个不错的起点。并尽量让你的代码更简单,你试图在一个地方做太多事情。
    • 投票赞成以积极的方式回答问题。
    【解决方案3】:

    老实说,你似乎让自己头疼。查看整数身份和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 |
    

    【讨论】:

      【解决方案4】:

      除了遗漏很多分号之外,你还得给我们更多的东西才能继续。

      实际上,SQL Server 可能不需要分号,所以忽略它...

      但是here 是开始学习 SQL Server 中存储过程的好地方。您也可以search Google 获取更多信息。

      【讨论】:

      • 嗨,我必须把分号放在哪里。我刚开始使用sql server。我还没有找到好的材料来学习有效的存储过程技术和语法。
      猜你喜欢
      • 2014-11-22
      • 1970-01-01
      • 2015-04-22
      • 2012-06-15
      • 1970-01-01
      • 2018-05-12
      • 2011-04-18
      • 2012-04-12
      相关资源
      最近更新 更多