1

テーブル行のいくつかの列を更新する必要があります。このためにストアド プロシージャを作成し、以下にキー コードを示します。@Title または @Descriptions が NULL でないことを確認し、この場合はこのデータを更新します。このような状況のベストプラクティスは何ですか?

UPDATE configuration
SET Title = @Title,
    Description = @Description, 
    ShowHeader = @ShowHeader,
    XmlConfiguration = @XmlConfiguration
WHERE Id = @Id

編集:

タイトルが null ではなく、説明が null であるとします。この場合、タイトルのみを更新し、説明は変更せずに保存します。出来ますか?

4

3 に答える 3

3
UPDATE configuration
SET Title = @Title,
    Description = @Description, 
    ShowHeader = @ShowHeader,
    XmlConfiguration = @XmlConfiguration
WHERE Id = @Id
AND (@Title IS NOT NULL OR @Descriptions IS NOT NULL)

新しい要件の場合:

UPDATE configuration
SET Title = @Title,
    Description = ISNULL(@Description,Description), 
    ShowHeader = ISNULL(@ShowHeader,ShowHeader),
    XmlConfiguration = @XmlConfiguration
WHERE Id = @Id
AND (@Title IS NOT NULL OR @Descriptions IS NOT NULL)
于 2013-09-16T19:05:15.420 に答える
1
UPDATE configuration
SET Title = ISNULL(@Title,Title),
    Description = ISNULL(@Description,Description), 
    ShowHeader = @ShowHeader,
    XmlConfiguration = @XmlConfiguration
WHERE Id = @Id

タイトルが null でないかどうかを確認してから、タイトルを更新します。説明と同じ考えです。

私の理解が正しければ、渡された値がnullでない場合にのみタイトル列をパラメーターの値に設定し、説明列と同様に実行する必要があります。

上記のコードはこれを行います。@Title と @Descriptions の両方が null の場合、対応する 2 つの列の値は変更されませんが、他の列は引き続き更新されます。@Title と @Descriptions の両方が null の場合、PM 77-1 と Lamak の回答は更新をまったく実行しません。

値は変更されないことに注意してください。ただし、実際には update ステートメントは列 (つまり、現在の値) に書き込みます。データの整合性に関しては違いはありませんが、監査や変更追跡の考慮事項に関しては重要な場合があります。

両方のパラメーターが null のときに更新を実行したくない場合は、次のような条件を追加できます。

IF @Title IS NOT NULL OR @Descriptions IS NOT NULL
BEGIN
    UPDATE configuration
    SET Title = ISNULL(@Title,Title),
        Description = ISNULL(@Description,Description), 
        ShowHeader = @ShowHeader,
        XmlConfiguration = @XmlConfiguration
    WHERE Id = @Id
END

if ブロックを使用すると、サーバーは最初に 2 つのパラメーター条件を評価するように強制されます。それらを where 句に入れると、サーバーが最初に @Id 条件をチェックすることを決定する可能性があります (可能性は低いですが)。上記のコードは、@Title と @Descriptions の両方が null の場合に潜在的なインデックス シークを回避します。ただし、これはせいぜい非常にわずかな節約です。

于 2013-09-16T19:16:00.420 に答える
0

この「トリック」を試すこともできます。

更新値が null の場合は、~original~ 値を使用します。

Use Northwind
GO


 declare @City varchar(12)
  select @City = null

 Update [dbo].[Customers]
 Set
    [City] = ISNULL(@City, custs.City)
From
[dbo].[Customers] custs

where CustomerID = 'WOLZA'

Select City as MyCity, * from [dbo].[Customers] where CustomerID = 'WOLZA'


  select @City = 'WarszawaABC'

 Update [dbo].[Customers]
 Set
    [City] = ISNULL(@City, custs.City)
From
[dbo].[Customers] custs

where CustomerID = 'WOLZA'

Select City as MyCity, * from [dbo].[Customers] where CustomerID = 'WOLZA'
于 2013-09-16T19:24:00.193 に答える