Saya ingin mengizinkan hanya mengizinkan sejumlah nilai untuk dimasukkan ke dalam kolom A
, dan bergantung pada nilai yang dimasukkan, hanya mengizinkan sejumlah nilai tertentu untuk dimasukkan ke dalam kolom B
. Misalnya
Misalnya
- Jika A = 1, B dapat berada di antara 1 dan 9
- Jika A = 2, B bisa berada di antara 10 DAN 19
- Jika A = 3, B bisa berada di antara 20 DAN 29
Bagaimana saya bisa mencapainya?
Saya pikir memeriksa batasan adalah tempat terbaik untuk memulai. Batasan sederhana akan memastikan hanya nilai 1-3 yang dapat ditambahkan ke kolom A
. Seperti:
CREATE TABLE dbo.test (
col_a INT,
col_b INT,
CONSTRAINT ch_col_a_valid_range CHECK (col_a BETWEEN 1 AND 3)
)
GO
Kemudian saya menggunakan fungsi skalar untuk menentukan apakah col_b
valid, dengan memasukkan nilai dari col_a
dan col_b
.
CREATE FUNCTION dbo.value_is_valid (
@a INT,
@b INT
)
RETURNS BIT
AS
BEGIN
IF (@a = 1 AND @b BETWEEN 1 AND 9) RETURN 1;
IF (@a = 2 AND @b BETWEEN 10 AND 19) RETURN 1;
IF (@a = 3 AND @b BETWEEN 20 AND 29) RETURN 1;
RETURN 0;
END
GO
Kemudian tambahkan batasan ke tabel, dan panggil fungsi tersebut sebagai bagian dari pemeriksaan.
CREATE TABLE dbo.test (
col_a INT,
col_b INT,
CONSTRAINT ch_col_a_valid_range CHECK (col_a BETWEEN 1 AND 3),
CONSTRAINT ch_col_b_valid_based_on_a CHECK(dbo.value_is_valid(col_a, col_b) = 1)
)
GO
Namun, penyisipan berikut gagal, mengeluhkan konflik dengan batasan ch_col_b_valid_based_on_a
yang ditambahkan.
INSERT INTO dbo.test (
col_a,
col_b
)
VALUES (1, 9)
Pernyataan INSERT bertentangan dengan batasan CHECK "ch_col_b_valid_based_on_a". Konflik terjadi pada database "MyDB", tabel "dbo.test".
Apa yang dapat saya lakukan untuk mengatasi hal ini dan mencapai hasil yang disebutkan di atas?
Jika dilihat ke belakang, pendekatan penggunaan fungsi skalar dalam batasan pemeriksaan ini berfungsi persis seperti yang diharapkan.