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)(將月份名稱轉換為日期/月份編號(問題和答案的組合))
主站蜘蛛池模板: 山东钢衬塑罐_管道_反应釜厂家-淄博富邦滚塑防腐设备科技有限公司 | 玻璃钢格栅盖板|玻璃钢盖板|玻璃钢格栅板|树篦子-长沙川皖玻璃钢制品有限公司 | 发光字|标识设计|标牌制作|精神堡垒 - 江苏苏通广告有限公司 | 微波萃取合成仪-电热消解器价格-北京安合美诚科学仪器有限公司 | 臭氧老化试验箱,高低温试验箱,恒温恒湿试验箱,防水试验设备-苏州亚诺天下仪器有限公司 | 郑州墨香品牌设计公司|品牌全案VI设计公司 | 诚暄电子公司首页-线路板打样,pcb线路板打样加工制作厂家 | 岛津二手液相色谱仪,岛津10A液相,安捷伦二手液相,安捷伦1100液相-杭州森尼欧科学仪器有限公司 | EPDM密封胶条-EPDM密封垫片-EPDM生产厂家| 天助网 - 中小企业全网推广平台_生态整合营销知名服务商_天助网采购优选 | 成都顶呱呱信息技术有限公司-贷款_个人贷款_银行贷款在线申请 - 成都贷款公司 | 公交驾校-北京公交驾校欢迎您! 工作心得_读书心得_学习心得_找心得体会范文就上学道文库 | 浙江寺庙设计-杭州寺院设计-宁波寺庙规划_汉匠 | 蓝莓施肥机,智能施肥机,自动施肥机,水肥一体化项目,水肥一体机厂家,小型施肥机,圣大节水,滴灌施工方案,山东圣大节水科技有限公司官网17864474793 | 桑茶-七彩贝壳桑叶茶 长寿茶 | 行星搅拌机,双行星搅拌机,动力混合机,无锡米克斯行星搅拌机生产厂家 | 河南空气能热水器-洛阳空气能采暖-洛阳太阳能热水工程-洛阳润达高科空气能商行 | LHH药品稳定性试验箱-BPS系列恒温恒湿箱-意大利超低温冰箱-上海一恒科学仪器有限公司 | 空冷器|空气冷却器|空水冷却器-无锡赛迪森机械有限公司[官网] | EDLC超级法拉电容器_LIC锂离子超级电容_超级电容模组_软包单体电容电池_轴向薄膜电力电容器_深圳佳名兴电容有限公司_JMX专注中高端品牌电容生产厂家 | LED灯杆屏_LED广告机_户外LED广告机_智慧灯杆_智慧路灯-太龙智显科技(深圳)有限公司 | 电磁铁_推拉电磁铁_机械手电磁吸盘电磁铁厂家-广州思德隆电子公司 | 【化妆品备案】进口化妆品备案流程-深圳美尚美化妆品有限公司 | 高压管道冲洗清洗机_液压剪叉式升降机平台厂家-林君机电 | 氮化镓芯片-碳化硅二极管 - 华燊泰半导体 | 三价铬_环保铬_环保电镀_东莞共盈新材料贸易有限公司 | 3d打印服务,3d打印汽车,三维扫描,硅胶复模,手板,快速模具,深圳市精速三维打印科技有限公司 | 石膏基自流平砂浆厂家-高强石膏基保温隔声自流平-轻质抹灰石膏粉砂浆批发-永康市汇利建设有限公司 | 合肥废气治理设备_安徽除尘设备_工业废气处理设备厂家-盈凯环保 合肥防火门窗/隔断_合肥防火卷帘门厂家_安徽耐火窗_良万消防设备有限公司 | 山东PE给水管厂家,山东双壁波纹管,山东钢带增强波纹管,山东PE穿线管,山东PE农田灌溉管,山东MPP电力保护套管-山东德诺塑业有限公司 | 进口试验机价格-进口生物材料试验机-西安卡夫曼测控技术有限公司 | 石油/泥浆/不锈钢防腐/砂泵/抽砂泵/砂砾泵/吸砂泵/压滤机泵 - 专业石油环保专用泵厂家 | 办公室家具公司_办公家具品牌厂家_森拉堡办公家具【官网】 | 一级建造师培训_一建培训机构_中建云筑建造师培训网校 | EFM 022静电场测试仪-套帽式风量计-静电平板监测器-上海民仪电子有限公司 | 广州物流公司_广州货运公司_广州回程车运输 - 万信物流 | 掺铥光纤放大器-C/L波段光纤放大器-小信号光纤放大器-合肥脉锐光电技术有限公司 | 桥架-槽式电缆桥架-镀锌桥架-托盘式桥架 - 上海亮族电缆桥架制造有限公司 | 热回收盐水机组-反应釜冷水机组-高低温冷水机组-北京蓝海神骏科技有限公司 | 户外环保不锈钢垃圾桶_标识标牌制作_园林公园椅厂家_花箱定制-北京汇众环艺 | 塑料脸盆批发,塑料盆生产厂家,临沂塑料广告盆,临沂家用塑料盆-临沂市永顺塑业 |