pbootcms网站模板|日韩1区2区|织梦模板||网站源码|日韩1区2区|jquery建站特效-html5模板网

檢查具有多個輸入參數的約束 UDF 不起作用

Check constraint UDF with multiple input parameters not working(檢查具有多個輸入參數的約束 UDF 不起作用)
本文介紹了檢查具有多個輸入參數的約束 UDF 不起作用的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!

問題描述

我正在嘗試對表實施檢查約束,這樣就無法在存在兩列(Int_1"和Int_2")已經具有我們想要的值的記錄的情況下插入記錄試圖插入例如:

I'm trying to implement a check constraint on a table such that records can't be inserted where there exists a record for which two of the columns ("Int_1" and "Int_2") already have the value we're trying to insert E.g.:

ID     Name     Int_1     Int_2
1      Dave       1         2

將 (2, Steve, 2, 2) 插入上表是可以的,就像 (3, Mike, 1, 3) 一樣,但不允許插入已經存在 Int_1 AND Int_2 的值,即 (4,Stuart, 1, 2) 是非法的.

Inserting (2, Steve, 2, 2) into the table above would be okay, as would (3, Mike, 1, 3), but inserting values where Int_1 AND Int_2 already exist is not allowed, i.e. (4, Stuart, 1, 2) is illegal.

我認為這樣定義我的表格會起作用:

I thought defining my table thus would work:

CREATE TABLE [Table](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [Name] [varchar](255) NOT NULL,
    [Int_1] [int] NOT NULL,
    [Int_2] [int] NOT NULL,
    CONSTRAINT [chk_Stuff] CHECK (dbo.chk_Ints(Int_1, Int_2)=1))

其中:dbo.chk_Ints 的定義:

where: dbo.chk_Ints is defined:

CREATE FUNCTION [dbo].[chk_Ints](@Int_1 int,@Int_2 int)
RETURNS int
AS
BEGIN

DECLARE @Result int

IF NOT EXISTS (SELECT * FROM [Table] WHERE Int_1 = @Int_1 AND Int_2 = @Int_2)
BEGIN
    SET @Result = 1
END
ELSE 
BEGIN
    SET @Result = 0
END

RETURN @Result
END

GO

當使用上面的組合時,如果我嘗試插入任何記錄,SQL 會告訴我我違反了檢查約束.我可以從表中刪除所有行并嘗試插入第一條記錄,SQL 告訴我我已經打破了我的約束,這是我不可能做到的!

When using the combo above, if I try to insert any record whatsoever, SQL tells me I've broken my check constraint. I can remove all rows from the table and try to insert a first record, and SQL tells me I've broken my constraint, which I can't possibly have done!

我已經在互聯網上搜索了一段時間,現在正在尋找 UDF 依賴于多個表列的檢查約束示例,但無濟于事.關于為什么這可能不起作用的任何想法?

I've scoured the internet for quite a while now looking for examples of check constraints where the UDF depends on multiple table columns, but to no avail. Any ideas as to why this might not work?

提前致謝:)

推薦答案

是的,這可能看起來令人費解,直到您意識到發生了什么,此時它變得非常明顯.

Yes, this may seem baffling until you realise what's going on, at which point it becomes quite obvious.

為您嘗試插入的行中的值調用該函數.但是想想函數是如何被調用的.調用它的是一個檢查約束.

The function is called for the values that are in the row you are trying to insert. But think of how the function is being called. It is a check constraint that calls it.

接下來,考慮傳遞的參數.他們來自哪里?根據定義,檢查約束從 Int_1Int_2 列中獲取它們.

Next, think of the parameters being passed. Where do they come from? According to the definition, the check constraint takes them from columns Int_1 and Int_2.

因此,它將它們作為列值傳遞.但是列值必須屬于一行.在這種情況下是哪一行?您要插入的那個!

So, it passes them as column values. But column values must belong to a row. Which row is it in this case? The one you are trying to insert!

這意味著此時您的行插入,只有交易仍在等待中.然而,該行在表中這一事實至關重要,因為這就是函數通過 1 結果發現和報告的內容.

That means your row is inserted at this point, only the transaction is still pending. And yet the fact that the row is in the table is crucial, because that's what the function finds and reports on with the 1 result.

因此,發生的事情是這樣的:

Thus, what's happening is this:

  • 您正在嘗試插入一行,

  • you are trying to insert a row,

函數看到該行并說具有給定參數的行已經存在,

the function sees that row and says that a row with the given parameters already exists,

檢查約束通過禁止插入相應地反應",

the check constraint "reacts" accordingly by prohibiting the insert,

插入回滾.

當然,既然您意識到了這一切,就很容易想出不同的檢查重復項的邏輯.基本上,您的函數應該記住"新行已經在表中,因此它應該嘗試確定它在表中的存在是否違反了您想要建立的任何規則.例如,您可以計算與給定參數匹配的行數,并查看結果是否不大于 1:

Of course, now that you realise all that, it is easy to come up with a different logic of checking for duplicates. Basically, your function should "keep in mind" that the new row is already in the table, and so it should try and determine whether its presence in the table violates any rules that you want to establish. You could, for instance, count the rows matching the given parameters and see if the result is not greater than 1:

IF (SELECT COUNT(*) FROM [Table] WHERE Int_1 = @Int_1 AND Int_2 = @Int_2) < 2
BEGIN
    SET @Result = 1
END
ELSE 
BEGIN
    SET @Result = 0
END

但是,在此作業的檢查約束中使用函數的整個想法遠不如僅在兩列上添加唯一約束,如由@a_horse_with_no_name 建議.這樣做:

However, the entire idea of using a function in a check constraint for this job is very much inferior to just adding a unique constraint on the two columns, as suggested by @a_horse_with_no_name. Do this:

ALTER TABLE [Table]
ADD CONSTRAINT UQ_Table_Int1_Int2 UNIQUE (Int_1, Int_2);

你可以忘記重復.

這篇關于檢查具有多個輸入參數的約束 UDF 不起作用的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!

【網站聲明】本站部分內容來源于互聯網,旨在幫助大家更快的解決問題,如果有圖片或者內容侵犯了您的權益,請聯系我們刪除處理,感謝您的支持!

相關文檔推薦

Converting Every Child Tags in to a Single Column with multiple Delimiters -SQL Server (3)(將每個子標記轉換為具有多個分隔符的單列-SQL Server (3))
How can I create a view from more than one table?(如何從多個表創建視圖?)
Create calculated value based on calculated value inside previous row(根據前一行內的計算值創建計算值)
How do I stack the first two columns of a table into a single column, but also pair third column with the first column only?(如何將表格的前兩列堆疊成一列,但也僅將第三列與第一列配對?) - IT屋-程序員軟件開發技
Recursive t-sql query(遞歸 t-sql 查詢)
Convert Month Name to Date / Month Number (Combinations of Questions amp; Answers)(將月份名稱轉換為日期/月份編號(問題和答案的組合))
主站蜘蛛池模板: 艾默生变频器,艾默生ct,变频器,ct驱动器,广州艾默生变频器,供水专用变频器,风机变频器,电梯变频器,艾默生变频器代理-广州市盟雄贸易有限公司官方网站-艾默生变频器应用解决方案服务商 | 新型游乐设备,360大摆锤游乐设备「诚信厂家」-山东方鑫游乐设备 新能源汽车电池软连接,铜铝复合膜柔性连接,电力母排-容发智能科技(无锡)有限公司 | 仿清水混凝土_清水混凝土装修_施工_修饰_保护剂_修补_清水混凝土修复-德州忠岭建筑装饰工程 | 湖南印刷厂|长沙印刷公司|画册印刷|挂历印刷|台历印刷|杂志印刷-乐成印刷 | 釜溪印象网络 - Powered by Discuz! | 运动木地板_体育木地板_篮球馆木地板_舞台木地板-实木运动地板厂家 | 骁龙云呼电销防封号系统-axb电销平台-外呼稳定『免费试用』 | 小区健身器材_户外健身器材_室外健身器材_公园健身路径-沧州浩然体育器材有限公司 | 小青瓦丨古建筑瓦丨青瓦厂家-宜兴市徽派古典建筑材料有限公司 | 高光谱相机-近红外高光谱相机厂家-高光谱成像仪-SINESPEC 赛斯拜克 | 叉车电池-叉车电瓶-叉车蓄电池-铅酸蓄电池-电动叉车蓄电池生产厂家 | 气象监测系统_气象传感器_微型气象仪_气象环境监测仪-山东风途物联网 | led冷热冲击试验箱_LED高低温冲击试验箱_老化试验箱-爱佩百科 | 不锈钢复合板厂家_钛钢复合板批发_铜铝复合板供应-威海泓方金属复合材料股份有限公司 | 叉车电池-叉车电瓶-叉车蓄电池-铅酸蓄电池-电动叉车蓄电池生产厂家 | 锂电混合机-新能源混合机-正极材料混料机-高镍,三元材料混料机-负极,包覆混合机-贝尔专业混合混料搅拌机械系统设备厂家 | hdpe土工膜-防渗膜-复合土工膜-长丝土工布价格-厂家直销「恒阳新材料」-山东恒阳新材料有限公司 ETFE膜结构_PTFE膜结构_空间钢结构_膜结构_张拉膜_浙江萬豪空间结构集团有限公司 | 皮带机-带式输送机价格-固定式胶带机生产厂家-河南坤威机械 | 钢绞线万能材料试验机-全自动恒应力两用机-混凝土恒应力压力试验机-北京科达京威科技发展有限公司 | 冷藏车厂家|冷藏车价格|小型冷藏车|散装饲料车厂家|程力专用汽车股份有限公司销售十二分公司 | 智慧养老_居家养老_社区养老_杰佳通 | 【德信自动化】点胶机_全自动点胶机_自动点胶机厂家_塑料热压机_自动螺丝机-深圳市德信自动化设备有限公司 | 无硅导热垫片-碳纤维导热垫片-导热相变材料厂家-东莞市盛元新材料科技有限公司 | 液氮罐(生物液氮罐)百科-无锡爱思科| 上海质量认证办理中心| 硫化罐-电加热蒸汽硫化罐生产厂家-山东鑫泰鑫智能装备有限公司 | 送料机_高速冲床送料机_NC伺服滚轮送料机厂家-东莞市久谐自动化设备有限公司 | 贵州科比特-防雷公司厂家提供贵州防雷工程,防雷检测,防雷接地,防雷设备价格,防雷产品报价服务-贵州防雷检测公司 | 成都中天自动化控制技术有限公司| 洛阳网站建设_洛阳网站优化_网站建设平台_洛阳香河网络科技有限公司 | CTAB,表面活性剂1631溴型(十六烷基三甲基溴化铵)-上海升纬化工原料有限公司 | 中医中药治疗血小板减少-石家庄血液病肿瘤门诊部 | 电液推杆生产厂家|电动推杆|液压推杆-扬州唯升机械有限公司 | 全自动包装秤_全自动上袋机_全自动套袋机_高位码垛机_全自动包装码垛系统生产线-三维汉界机器(山东)股份有限公司 | 【365公司转让网】公司求购|转让|资质买卖_股权转让交易平台 | 定硫仪,量热仪,工业分析仪,马弗炉,煤炭化验设备厂家,煤质化验仪器,焦炭化验设备鹤壁大德煤质工业分析仪,氟氯测定仪 | 奶茶加盟,奶茶加盟店连锁品牌-甜啦啦官网 | 油缸定制-液压油缸厂家-无锡大鸿液压气动成套有限公司 | 锡膏喷印机-全自动涂覆机厂家-全自动点胶机-视觉点胶机-深圳市博明智控科技有限公司 | 闪蒸干燥机-喷雾干燥机-带式干燥机-桨叶干燥机-[常州佳一干燥设备] | 涂层测厚仪_光泽度仪_uv能量计_紫外辐照计_太阳膜测试仪_透光率仪-林上科技 |