我正试图找到一种方法来插入新记录,只有在表中不存在。
这是存储过程:
USE [ABSTest]
GO
/****** Object: StoredProcedure [dbo].[sp_InsertBudgetCommessaInPreventivo] Script Date: 01/07/2013 09:12:16 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <Alex Ziani>
-- Create date: <04/01/2013>
-- Description: <Insert di valori con inserimento di parametri>
-- =============================================
ALTER PROCEDURE [dbo].[sp_InsertBudgetCommessaInPreventivo]
@Progressivo nvarchar(50),
@Durata float,
@Costo money,
@CostoStandard money,
@Tariffa money,
@SpeseStandard money,
@Codice_Tipo nvarchar(50),
@Codice_FiguraProfessionale nvarchar(10),
@Codice_Risorsa nvarchar(50),
@Codice_Commessa nvarchar(20),
@Codice_ODL nvarchar(30),
@Task nvarchar(100)
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
IF NOT EXISTS (SELECT * FROM Preventivo WHERE Progressivo = @Progressivo
AND Quantita = @Durata
AND Costo = @Costo
AND CostoStandard = @CostoStandard
AND Tariffa = @Tariffa
AND SpeseStandard = @SpeseStandard
AND FkCodiceEnumTipoPreventivo = @Codice_Tipo
AND FkCodiceEnumFiguraProfessionale = @Codice_FiguraProfessionale
AND FKCodiceRisorsa = @Codice_Risorsa
AND FkCodiceCommessa = @Codice_Commessa
AND FkCodiceOrdineDiLavoro = @Codice_ODL
AND Task = @Task)
BEGIN
INSERT INTO [ABSTest].[dbo].[Preventivo]
([Progressivo]
,[Quantita]
,[Costo]
,[CostoStandard]
,[Tariffa]
,[SpeseStandard]
,[FkCodiceEnumTipoPreventivo]
,[FkCodiceEnumFiguraProfessionale]
,[FKCodiceRisorsa]
,[FkCodiceCommessa]
,[FkCodiceOrdineDiLavoro]
,[Task])
VALUES
(@Progressivo
,@Durata
,@Costo
,@CostoStandard
,@Tariffa
,@SpeseStandard
,@Codice_Tipo
,@Codice_FiguraProfessionale
,@Codice_Risorsa
,@Codice_Commessa
,@Codice_ODL
,@Task)
END
ELSE
BEGIN
RAISERROR 50001 'ERRORE: RECORD GIà PRESENTE'
END
END
这样可以正常工作,但所有值(主键除外)都是Nullable
,所以如果我将参数设置为Null
,则它不起作用。如何使用Null
来设计它?
答案 0 :(得分:2)
您可以使用以下代码进行检查:
IF NOT EXISTS (SELECT * FROM Preventivo WHERE ISNULL(Progressivo,'') = ISNULL(@Progressivo,'')
AND ISNULL(Quantita,0) = ISNULL(@Durata,0)
AND ISNULL(Costo,0) = ISNULL(@Costo,0)
AND ISNULL(CostoStandard,0) = ISNULL(@CostoStandard,0)
AND ISNULL(Tariffa,0) = ISNULL(@Tariffa,0)
AND ISNULL(SpeseStandard,0) = ISNULL(@SpeseStandard,0)
AND ISNULL(FkCodiceEnumTipoPreventivo,'') = ISNULL(@Codice_Tipo,'')
AND ISNULL(FkCodiceEnumFiguraProfessionale,'') = ISNULL(@Codice_FiguraProfessionale,'')
AND ISNULL(FKCodiceRisorsa,'') = ISNULL(@Codice_Risorsa,'')
AND ISNULL(FkCodiceCommessa,'') = ISNULL(@Codice_Commessa,'')
AND ISNULL(FkCodiceOrdineDiLavoro,'') = ISNULL(@Codice_ODL,'')
AND ISNULL(Task,'') = ISNULL(@Task,'') )
答案 1 :(得分:1)
使用ISNULL作为比较运算符。可能会慢一点
SELECT * FROM Preventivo WHERE ISNULL(Progressivo, '') = ISNULL(@Progressivo, '')
答案 2 :(得分:1)
您可以使用Case语句
来实现此目的例如
AND Quantita = CASE @Durata
WHEN null THEN Quantita
ELSE @Durata
所以当@Durata == null的情况下会返回Quantita本身,所以结果将是真的(Quantita = Quantita)
答案 3 :(得分:0)
对于null你需要输入条件
where column_name is null
在您的原因中,您可以使用sql server中可用的IsNull()
函数,如此
where IsNull(column_name,-1) = Isnull(@variable,-1)
将变量值与列进行比较,如上所述,轻松解决问题
答案 4 :(得分:0)
您的存储过程正在尝试
NULL = NULL
更改存储过程的第一个语句,它应该可以正常工作
SET ANSI_NULLS OFF;
如果您使用的是SQL 2008 R2或更高版本,请考虑使用MERGE语句。
拉吉