Birlikte çalıştığım veritabanı uygulamasında oldukça yaygın bir örüntü, "önizleme modu" olan bir rapor veya yardımcı program için saklı yordam oluşturma gereksinimidir. Böyle bir yordam güncelleştirme yaptığında, bu parametre eylemin sonuçlarının döndürülmesi gerektiğini, ancak yordamın veritabanındaki güncelleştirmeleri gerçekten gerçekleştirmemesi gerektiğini belirtir.
Bunu yapmanın bir yolu if
, parametre için bir deyim yazmak ve iki tam kod bloğuna sahip olmaktır ; bunlardan biri verileri günceller ve döndürür, diğeri ise sadece verileri döndürür. Ancak, kod çoğaltma ve önizleme verilerinin aslında bir güncellemeyle ne olacağının doğru bir yansıması olduğuna dair nispeten düşük bir güven derecesi nedeniyle bu istenmeyen bir durumdur.
Aşağıdaki örnek, canlı güncelleme modu olarak önizleme modu için yalnızca tek bir kod bloğunu kullanmak için işlem kayıt noktalarını ve değişkenlerini (işlemlerden etkilenmeyen geçici tabloların aksine) kullanmaya çalışır.
Not: Bu yordam çağrısının kendisi bir işleme yuvalanmış olabileceğinden, işlem geri almaları bir seçenek değildir. Bu SQL Server 2012'de test edilmiştir.
CREATE TABLE dbo.user_table (a int);
GO
CREATE PROCEDURE [dbo].[PREVIEW_EXAMPLE] (
@preview char(1) = 'Y'
) AS
CREATE TABLE #dataset_to_return (a int);
BEGIN TRANSACTION; -- preview mode required infrastructure
DECLARE @output_to_return TABLE (a int);
SAVE TRANSACTION savepoint;
-- do stuff here
INSERT INTO dbo.user_table (a)
OUTPUT inserted.a INTO @output_to_return (a)
VALUES (42);
-- catch preview mode
IF @preview = 'Y'
ROLLBACK TRANSACTION savepoint;
-- save output to temp table if used for return data
INSERT INTO #dataset_to_return (a)
SELECT a FROM @output_to_return;
COMMIT TRANSACTION;
SELECT a AS proc_return_data FROM #dataset_to_return;
RETURN 0;
GO
-- Examples
EXEC dbo.PREVIEW_EXAMPLE @preview = 'Y';
SELECT a AS user_table_after_preview_mode FROM user_table;
EXEC dbo.PREVIEW_EXAMPLE @preview = 'N';
SELECT a AS user_table_after_live_mode FROM user_table;
-- Cleanup
DROP TABLE dbo.user_table;
DROP PROCEDURE dbo.PREVIEW_EXAMPLE;
GO
Bu kod ve tasarım deseni hakkında geri bildirim arıyorum ve / veya aynı soruna başka çözümler farklı formatlarda varsa.