T-SQL 存储过程:更新 IF/ELSE 语句内的局部变量

T-SQL stored procedure: update local variable inside IF/ELSE statement

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

objective 是通过使用已声明的 @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: Cannot insert the value NULL into column 'customer_id', table 'dbo.item'

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

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);

您的 WHERE 子句似乎有误

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