【发布时间】:2019-11-07 20:31:25
【问题描述】:
我创建了以下存储过程来运行 exec sp_InsertAirport 'value1','value2', etc... 。但是,我收到下面列出的错误。如您所见,我尝试了各种方法来删除空值,但都没有奏效。如何成功删除 sp 中的 Null 以便它可以成功插入?
消息 50000,级别 16,状态 2,过程 sp_InsertAirport,第 128 行 [批处理开始第 2 行] 无法将值 NULL 插入到列“纬度”、表“DB_Airports.dbo.tbl_Airports”中;列不允许空值。插入失败。
USE [DB_Airports]
GO
IF OBJECT_ID('SP_InsertAirport', 'P') IS NOT NULL
DROP PROCEDURE [dbo].[SP_InsertAirport]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[SP_InsertAirport]
@ICAOCode VARCHAR(4) NULL,
@IATACode VARCHAR(3) NULL,
@AirportName VARCHAR(MAX),
@City VARCHAR(MAX),
@Latitude DECIMAL(8,3), --NOT NULL
@Longitude DECIMAL (11,3), --NOT NULL
@Elevation INT,
@CountryName NVARCHAR(MAX)
...
INSERT INTO tbl_Airports(ICAOCode, IATACode, AirportName, City, Latitude, Longitude, Elevation)
VALUES (@ICAOCode, @IATACode, @AirportName, @City, @Latitude, @Longitude, @Elevation)
UPDATE tbl_Airports SET Latitude ='0' WHERE Latitude IS NULL
UPDATE tbl_Airports SET Longitude ='0' WHERE Longitude IS NULL
DELETE FROM tbl_Airports WHERE Latitude = 0 AND Longitude = 0
END TRY
BEGIN CATCH
COMMIT TRANSACTION
END
GO
【问题讨论】:
-
有点绕道,但您需要阅读一些内容。 sqlperformance.com/2012/10/t-sql-queries/sp_prefix
-
为什么不知道默认值?这就是 NULL 首先存在的原因。您真的应该修复表设计以允许 NULL,或者如果其中任何一个值为 NULL,则根本不插入该行。
-
读取程序中的逻辑。然后阅读你写的作为你的问题。您的代码专门尝试 - 以一种破碎的、不合逻辑的方式 - 避免插入纬度和经度都为零的行。因此,如果您尝试在插入后立即删除 NULL 值,则尝试将其替换为零是没有意义的。是时候退后一步,谈谈你想要完成的事情,因为这似乎是一系列设计不佳的创可贴,用于定义不明确的任务。
标签: sql sql-server stored-procedures null