【问题标题】:T-SQL stored procedure: update local variable inside IF/ELSE statementT-SQL 存储过程:更新 IF/ELSE 语句中的局部变量
【发布时间】:2021-11-09 01:32:45
【问题描述】:

我有一个item 表,它有一个外键约束@​​987654323@,它引用了一个customer 表。 customer_id 列的类型为 uniqueidentifier,需要在插入时生成(我们无法使用客户端提供的值)。我创建了一个 T-SQL(使用 SQL Server Express)存储过程,使用 ADO 实体数据模型从 C# 调用以向数据库添加记录。

目标是通过使用声明的@customer_id 变量引用已存在的客户记录或新创建的客户记录来创建一个项目(如果它不存在)。

以下是我的存储过程的简化版本。

CREATE PROCEDURE dbo.uspInsertRecord
    @serial_num AS INT,
    @customer_address AS VARCHAR(30)
AS 
    DECLARE @customer_id AS UNIQUEIDENTIFIER;

    IF NOT EXISTS (SELECT 1 FROM dbo.customer WHERE address = @customer_address)
    BEGIN 
        SET @customer_id = NEWID()
 
        INSERT INTO dbo.customer (customer_id, customer_address)
        VALUES (@customer_id, @customer_address)
    END
    ELSE
    BEGIN
        SELECT @customer_id = customer_id 
        FROM dbo.customer
        WHERE customer_id = @customer_id
    END

    IF NOT EXISTS (SELECT 1 FROM dbo.item WHERE serial_num = @serial_num)
   BEGIN
   INSERT INTO dbo.item (serial_num, customer_id)
   VALUES (@serial_num, @customer_id)
   END

此过程适用于新创建的客户记录,但不适用于引用现有客户记录。

尝试添加具有现有关联customer_id 的项目会抛出一个

SqlException:无法将值 NULL 插入列“customer_id”、表“dbo.item”

我对 T-SQL 相当陌生,但这似乎是一个范围问题。有什么想法吗?

【问题讨论】:

  • 不确定其余代码的去向,例如END,但由于错误消息引用表 dbo.item,您可能想考虑为什么 INSERT INTO dbo.item (serial_num, customer_id) 不提供任何变量值。提示:请阅读this 以获取有关改进问题的一些提示。为表格添加 DDL 有助于我们为您提供帮助。
  • HABO,感谢您提供的信息。我正在从我的工作计算机上转录问题并试图简化它以节省时间,但现在它已更新为示例代码的其余部分。谢谢!

标签: sql sql-server tsql stored-procedures


【解决方案1】:

您的WHERE 子句似乎有误

        SELECT @customer_id = customer_id 
        FROM dbo.customer
        WHERE address = @customer_address    -- not @customer_id

【讨论】:

  • 是的,查理脸!我的问题是我试图将一个空值与一个 UNIQUEIDENTIFIER 进行比较,所以它抛出了一个空指针异常。非常感谢!
【解决方案2】:
INSERT INTO dbo.customer (@customer_id);

在您的第一个 IF 块中不是正确的 SQL 语句。而是:

INSERT INTO dbo.customer (customer_id) VALUES (@customer_id);

您的第二个INSERT 语句也存在同样的问题。这里的格式是:

INSERT INTO dbo.item (serial_num, customer_id)
  VALUES (@serial_num, @customer_id);

【讨论】:

  • JNevill,感谢您的反馈。不幸的是,这不是解决方法,我只是在将这些行从我的工作机器转录到我的本地机器时忘记添加这些行。我已在示例中添加了正确的代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-08-16
  • 1970-01-01
  • 1970-01-01
  • 2013-11-18
  • 1970-01-01
  • 2018-01-09
  • 1970-01-01
相关资源
最近更新 更多