3

テーブルに存在しない場合にのみ新しいレコードを挿入する方法を見つけようとしています。

ストアドプロシージャは次のとおりです。

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値として入力すると機能しません。どうすればそれがNullsでも動作するように設計できますか?

4

5 に答える 5

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,'') )
于 2013-01-07T12:13:50.933 に答える
1

Caseステートメントを使用してこれを実現できます

例えば

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

したがって、 @Durata==null の場合、列 Quantita 自体が返されるため、結果は true (Quantita =Quantita ) になります。

于 2013-01-07T11:16:16.483 に答える
1

比較演算子として ISNULL を使用します。少し失速するかも

SELECT * FROM Preventivo WHERE ISNULL(Progressivo, '') = ISNULL(@Progressivo, '')
于 2013-01-07T11:06:21.917 に答える
0

nullの場合、条件を入力する必要があります

where column_name  is null

あなたの原因では、IsNull()このようにSQLサーバーで利用可能な関数を利用することができます

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

上記のように変数の値を列と比較して、問題を簡単に解決します

于 2013-01-07T11:04:52.703 に答える
0

あなたのストアドプロシージャはしようとしています

NULL = NULL

ストアド プロシージャの最初のステートメントを変更すると、動作するはずです

SET ANSI_NULLS OFF;

SQL 2008 R2 以降を使用している場合は、MERGE ステートメントの使用を検討してください。

ラージ

于 2013-01-07T11:10:54.473 に答える