【发布时间】: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