是否有可能創造出有其值的列的一個檢查約束的表位於另一個SQL查詢給出的結果集內的表我可以創建檢查約束,其值依賴於SQL查詢
例如。
create table tablename
(
name varchar(10),
rollno int
)check rollno in (select rollno from anotherDatabase.TableName,candidateRoll)
或任何類似的事情。
我不必在任何地方使用它,但仍想知道。
是否有可能創造出有其值的列的一個檢查約束的表位於另一個SQL查詢給出的結果集內的表我可以創建檢查約束,其值依賴於SQL查詢
例如。
create table tablename
(
name varchar(10),
rollno int
)check rollno in (select rollno from anotherDatabase.TableName,candidateRoll)
或任何類似的事情。
我不必在任何地方使用它,但仍想知道。
如果使用外鍵引用無法實現您想要的功能,那麼您可以在函數調用中包裝SELECT語句。
你的檢查約束的表達可能是這個樣子:
(dbo.SomeFunction([col1]) != 0)
的功能可能是這樣的(假設列是一個varchar):
create function dbo.SomeFunction(@arg varchar(max))
returns bit
as
begin
return
(
select count(*) from SomeOthertable where col2 = @arg
)
end
EDIT(2010年6月9日):關於Anthony的評論,我的測試表明,大於1的count(*)
值仍然返回爲1.所以看起來函數沒問題,即使它可能顯式返回1或0。或者,如果您對實際的rowcount感興趣,請將返回類型從BIT更改爲INT。
是:對於同一個數據庫外鍵連接
create table tablename
(
name varchar(10),
rollno int FOREIGN KEY (candidateRoll) REFERENCES OtherTableName (candidateRoll)
)
如果它是那麼不同的數據庫如使用代碼通過存儲過程插入或通過觸發器強制執行
但是,不可能應用跨數據庫關係 – Madhivanan 2010-06-08 10:30:35
@Madhivanan:嚴格來說,不存在「跨數據庫關係」這樣的事情。如果它是相關的,它是相同的數據庫。我提到了這種情況下的觸發器和存儲過程 – gbn 2010-06-08 10:33:08
好的解決方案。雖然從int到bit的隱含會話有點可怕,但如果COUNT(*)> 1會發生什麼? – 2010-06-08 12:39:27
是的好點。到目前爲止,我只在主鍵上使用這種方法,因此COUNT(*)> 1的可能性爲零。 – 2010-06-09 03:21:13