【问题标题】:Remove all NULL values in Stored Procedure删除存储过程中的所有 NULL 值
【发布时间】: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


【解决方案1】:

我想你只是想要coalesce():

INSERT INTO tbl_Airports(ICAOCode, IATACode, AirportName, City, Latitude, Longitude, Elevation) 
    VALUES (@ICAOCode, @IATACode, @AirportName, @City,
            COALESCE(@Latitude, 0),
            COALESCE(@Longitude, 0),
            @Elevation
           );

我认为0 是一个非常糟糕的默认值,因为它是一个有效值。赤道上可能有机场。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-24
    • 1970-01-01
    • 2019-04-12
    • 1970-01-01
    • 2014-01-10
    • 1970-01-01
    • 2012-08-24
    相关资源
    最近更新 更多