2013-01-07 49 views
2

我試圖找到一種方法來插入一個新的記錄,只有當它不存在於表中。如何不插入空記錄的雙記錄

這裏的存儲過程:

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

是你的工作? –

回答

0

爲空,你需要把conditon

where column_name is null 

在你的事業,您可以利用IsNull()功能的SQL Server中提供這樣的

where IsNull(column_name,-1) = Isnull(@variable,-1) 

比較與列變量的值,如上面給出輕鬆解決問題

1

使用ISNULL作爲比較運算符。可能慢一點

SELECT * FROM Preventivo WHERE ISNULL(Progressivo, '') = ISNULL(@Progressivo, '') 
0

你的存儲過程是試圖做

NULL = NULL 

更改存儲過程的第一個語句,它應該如果您使用的是SQL工作

SET ANSI_NULLS OFF; 

2008 R2或以上,請考慮使用MERGE語句。

拉吉

1

你可以做到這一點使用Case語句

對於如

AND Quantita = CASE @Durata 
WHEN null THEN Quantita 
ELSE @Durata 

因此,當@ DURATA == NULL的情況下會返回列Quantita本身這樣的結果將是真實的(Quantita = Quantita)

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,''))