I am relatively new to SQL and as a project I have been asked to create the SQL for a simple database to record train details. I want to implement a check constraint which will prevent data from being inserted into a table if the weight of the train is more than the maximum towing weight of the locomotive. FOr instance, I need to add the unladen weight and maximum capacity of each wagon (located in the wagon type table) and compare it against the locomotive maximum pulling weight (the locomotive class table). I have the following SQL but it will not work:
check((select SUM(fwt.unladen_weight+fwt.maximum_payload) from hauls as h,freight_wagon as fw,freight_wagon_type as fwt,train as t where h.freight_wagon_serial_number = fw.freight_wagon_serial_number and fw.freight_wagon_type = fwt.freight_wagon_type and h.train_number = t.train_number) < (select lc.maximum_towing_weight from locomotive_class as lc,locomotive as l,train as t where lc.locomotive_class = l.locomotive_class and l.locomotive_serial_number = t.locomotive_serial_number))
The hauls table is where the constraint has been placed and is the intermediary table between train and freight wagon.
I may not have explained this very well; but in short, i need to compare the sum of two values in one table against a values located in another table...At present I keep getting a message telling me the sub query cannot return more than one row.
Hey. I need to substitute a value from a table if the input var is null. This is fine if the value coming from table is not null. But, it the table value is also null, it doesn't work. The problem I'm getting is in the isnull line which is in Dark green color because @inFileVersion is set to null explicitly and when the isnull function evaluates, value returned from DR.FileVersion is also null which is correct. I want the null=null to return true which is why i set ansi_nulls off. But it doesn't return anything. And the select statement should return something but in my case it returns null. If I comment the isnull statements in the where clause, everything works fine. Please tell me what am I doing wrong. Is it possible to do this without setting the ansi_nulls to off??? Thank you
set ansi_nulls off
go
declare
@inFileName VARCHAR (100),
@inFileSize INT,
@Id int,
@inlanguageid INT,
@inFileVersion VARCHAR (100),
@ExeState int
set @inFileName = 'A0006337.EXE'
set @inFileSize = 28796
set @Id= 1
set @inlanguageid =null
set @inFileVersion =NULL
set @ExeState =0
select Dr.StateID from table1 dR
where
DR.[FileName] = @inFileName
AND DR.FileSize =@inFileSize
AND DR.FileVersion = isnull(@inFileVersion,DR.FileVersion)
I am trying to create table with following SQL script:
Code Snippet
create table Projects( ID smallint identity (0, 1) constraint PK_Projects primary key, Name nvarchar (255) constraint NN_Prj_Name not null, Creator nvarchar (255), CreateDate datetime );
When I execute this script I get following error message:
Error source: SQL Server Compact ADO.NET Data Provider Error message: Named Constraint is not supported for this type of constraint. [ Constraint Name = NN_Prj_Name ]
I looked in the SQL Server Books Online and saw following:
CREATE TABLE (SQL Server Compact) ... < column_constraint > ::= [ CONSTRAINT constraint_name ] { [ NULL | NOT NULL ] | [ PRIMARY KEY | UNIQUE ] | REFERENCES ref_table [ ( ref_column ) ] [ ON DELETE { CASCADE | NO ACTION } ] [ ON UPDATE { CASCADE | NO ACTION } ]
As I understand according to documentation named constraints should be supported, however error message says opposite. I can rephrase SQL script by removing named constraint.
Code Snippet
create table Projects( ID smallint identity (0, 1) constraint PK_Projects primary key, Name nvarchar (255) not null, Creator nvarchar (255), CreateDate datetime ); This script executes correctly, however I want named constraints and this does not satisfy me.
In my report i have CNAME parameter , which allows null value. I checked Allow null value check box in report parameter properties.
when i preview the report , it displays checked NULL check box beside CNAME parameter . I want to give some meaningful name(i.e.ALLCustomers) to this checkbox instead of NULL.
I have a problem. I have two feilds in a table. Both of them are (int). I want to be able make sure the same number is not put in both columns for each row. Both colums have to be a different number, and also if one is null, the other cannot be. How do I go about enforcing this policy?
Hi I was wodering how to add an OR statment right in the Check Constraint expression. This is what I am starting with in the database ([zip] like '[0-9][0-9][0-9][0-9][0-9]') and what I want well not exact but this would answer my question ([zip] like '[0-9][0-9][0-9][0-9][0-9] || [A-Z][A-Z][A-Z][A-Z][A-Z]') Thanks for any help
Hi, i want to put a check constraint on one of my tables to make sure that a member doesn't get loaded into the same usergroup twice. Could anyone please help me with this.
Here is some sample code:
Code Block
DECLARE @MyTable TABLE (ID INT IDENTITY(1,1), MemberID INT, ClientID INT, UsergroupID INT) INSERT INTO @MyTable VALUES (123456, 211, 3054) -- Member gets loaded twice INSERT INTO @MyTable VALUES (123456, 211, 3054) INSERT INTO @MyTable VALUES (123456, 211, 3055) -- Same Member as the top but into ---- a different usergroup which is correct INSERT INTO @MyTable VALUES (215489, 376, 2017) INSERT INTO @MyTable VALUES (987512, 345, 2237) INSERT INTO @MyTable VALUES (235479, 333, 1158) INSERT INTO @MyTable VALUES (354985, 333, 1158)
SELECT * FROM @MyTable
The problem i have is that if a member is loaded into the same usergroup twice then the sites crash on the web applications and the member can't get into his profile page.Unfortunately i don't know which one of the 1000 stored procedures are used to access this table so that i could just change the query to SELECT TOP 1.
However i think that it will be better practive to just put a check contraint on the table and avoide the whole problem.
However 1 member can belong to multiple usergroups.
In our database we have an indexed field that is using unique values, so in the index we turned on the unique property. Now with some changes we made in the application this value can be Null (could not be Null in the past). When we have more as 1 value having value Null we get an exception of unique key violation.
Therefor we want to make an check constraint the checks if the value allready exists when the value is not Null.
Hi, I am trying to enforce a rule that only one record in a table can have status 'Active'. I'd like to do this with CHECK constraint rather than trigger. I know SQL server doesn't support subqueries such as : alter table add constraint chk_OnlyOneActive CHECK (1=(select count(*) from mytable where status='Active')) Is there any workaround for this? P.S. I tried using UDF like this: alter table add constraint chk_OnlyOneActive CHECK (dbo.NumActiveRecords()=1) and it works for insert - I am not able to insert a second "Active" record, but for some reason doesn't work for update - I am able to update existing record to status "Active" and end up with two or more Active records in the table. Thank you.
I am creating a check constraint on a field (GRID_NBR) for values between 1 & 99. I am a little confused on creating the expression for it (Books online is vague).
Can I use the following expression: GRID_NBR BETWEEN 1 AND 99
Or do I have to use: GRID_NBR > 0 AND GRID_NBR < 100
I have a table with 3 columns in it. The ID column has a datetime data type.
Does anyone know how to apply a check constraint on this field so that the same month cannot be entered twice.
For example the field has the following data in the field 26/04/2008 27/05/2008 26/06/2008 25/07/2008
A user then tries to enter the value 20/05/2008, I would like the check constraint to block this value being entered due to the fact that a item with the same month value has already been entered.
I have created a table which contains date periods. It has 3 fields all with DateTime data types. These fields being ID, BeginDate, and EndDate. The ID field will hold a date indicating what month the reord is for, ie 01/03/2007 being March or 05/04/2007 being April. The BeginDate will contain the beginnig date for the financial month and EndDate for the financial month.
I am trying to apply a check constraint on the ID field so that combaination of a month and year can only be entered once, ie. if 01/03/2007 already exists in the table then 03/03/2007 cannot.
I need to create a check constraint for an email column/field, where the field must contain an "@" symbol. Does sql (oracle or SQL in general) let you do this.
1. Tried myself: ALTER TABLE Q_Customer ADD CONSTRAINT Q_chk_Cus_email CHECK (Cus_email LIKE '%@%');
I want to incorporate a Check constraint within a trigger, based on this but im struggling with the coding.Assuming that is an Alphanumeric field you should be checking what value is in the alphanumeric column from inserted, comparing it with whatever is in the AMGR_User_Fields_Tbl to see if there’s a duplicate and then raising the error...This is my Trigger:
ALTER TRIGGER [dbo].[DUPLICATES] ON [dbo].[AMGR_User_Fields_Tbl]
FOR INSERT, UPDATE AS DECLARE @Alphanumericcol VARCHAR (750)
-- This trigger has been created to check that duplicate rows are not inserted into table.
-- Check if row exists SELECT @Alphanumericcol FROM Inserted i, AMGR_User_Fields_Tbl t
I am having some difficulties to find the documentation relative to the syntax of CHECK and CONTRAINT in MS SQL Server 2005. Can someone points me toward a reference guide?
Thanks in advance, Joannès http://www.peoplewords.com
Hi , I have a table that holds CityName and TownName.This table is usually updated and I dont want the same CityName and TownName to be inserted Again. I have used Primary Key that holds thoose two fields but Primary Key is an index and I know that using check constraint works by spending less performance then indexes .
So , How can I use a check Constraint for two fields ?
Hi there, My problem should be fairly simple. Say i have a small table with 2 columns, employee_id and department_id. I want to create a check constraint so that no more than 4 employee_id can be associated with department_id and the user is warned if he/she is trying to do so. Can anyone advise me on how to do it? Regards, Kam
Hi,I am new to database development and am writing a database as part of auniversity courseI have created a table as below called CableWire - the table is created ok.CREATE TABLE CableWire(CableWireID CHAR(7),BSstandard CHAR(16),Colour VARCHAR(16),Material VARCHAR(16),MetresInStock INTEGER,PRIMARY KEY (CableWireID));However when I try to alter the table by adding a CHECK constraint:ALTER TABLE CableWireADD CHECK (MetresInStock >= 0);I get a pop-up box: "Line: 21SQLSTATE = 37000[Microsoft][ODBC dBase Driver] Syntax error in field definition, Continue?"(line 21 equated to the 2nd of those 2 lines). The syntax seems perfectlyacceptable to me. Any help appreciated.Regards,Mary
Can we use parentheses in a check constraint in MS-SQL-server DDL?e.g. I'm having a problem with the following statement:ALTER TABLE [dbo].[MyTable] ADD CONSTRAINT [CK_MyTable_TimesDataOK]CHECK (([TimeOn] IS NULL AND [TimeOff] IS NULL)OR([ShiftCode] IS NOT NULL AND [TimeOn] IS NOT NULL AND [TimeOff] IS NOTNULL));The statement appears to run fine, but when I look at my tabledefinition afterwards, it appears that SQL-server ignored theparentheses in my constraint; it shows the constraint expression as:(([TimeOn] IS NULL AND [TimeOff] IS NULL OR [ShiftCode] IS NOT NULL AND[TimeOn] IS NOT NULL AND [TimeOff] IS NOT NULL))My intention is that if there's (non null) data in either of the columnsTimeOn or TimeOff is not null, all three of the columns TimeOn, TimeOffand ShiftCode must have non null data.OK, I realise I could enforce this by altering my table setup in otherways. Right now I'm just trying to figure out if this I'm just upagainst a difference between dialects of SQL in check constraints here.Am I missing something obvious with parentheses?BTW the DDL for the table I'm testing on:CREATE TABLE [dbo].[MyTable]([FNname] [nvarchar](50) NOT NULL,[ShiftDate] [datetime] NOT NULL,[ShiftCode] [nchar](2) NULL,[TimeOn] [nchar](4) NULL,[TimeOff] [nchar](4) NULL);
I thought the whole point of 'check constraint' being unticked meant you could whack your data straight in no probs.
How can I insert a bunch of historical information where I want to control the PK, in this case DealID?
I have got 'keep identity' checked.
I check the db, the Id does NOT exist currently.
Error: 0xC0202009 at Data Cleansing, Deal Insert [12194]: SSIS Error Code DTS_E_OLEDBERROR. An OLE DB error has occurred. Error code: 0x80004005. An OLE DB record is available. Source: "Microsoft SQL Native Client" Hresult: 0x80004005 Description: "The statement has been terminated.". An OLE DB record is available. Source: "Microsoft SQL Native Client" Hresult: 0x80004005 Description: "Violation of PRIMARY KEY constraint 'PK_DealID'. Cannot insert duplicate key in object 'dbo.Deal'.".
What I want to do is write a constraint (or 4 constraints) that says: If AttributeDataType = 'nvarchar', AttributeLength cannot be NULL, AttributePrecision must be NULL, AttributeScale must be NULL If AttributeDataType = 'int', AttributeLength must be NULL, AttributePrecision must be NULL, AttributeScale must be NULL If AttributeDataType = 'datetime', AttributeLength must be NULL, AttributePrecision must be NULL, AttributeScale must be NULL If AttributeDataType = 'decimal', AttributeLength must be NULL, AttributePrecision cannot be NULL, AttributeScale cannot be NULL
Is that even possible? I've tried and failed (admittedly not for too long) to fathom a way of doing it.
I have created a table which contains date periods. It has 3 fields all with DateTime data types. These fields being ID, BeginDate, and EndDate. The ID field will hold a date indicating what month the reord is for, ie 01/03/2007 being March or 05/04/2007 being April. The BeginDate will contain the beginnig date for the financial month and EndDate for the financial month.
I am trying to apply a check constraint on the ID field so that combaination of a month and year can only be entered once, ie. if 01/03/2007 already exists in the table then 03/03/2007 cannot.
Hi, I need the T-SQL statement on how to raise a custom error message for a check contraint @au_id '[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9][0-9][0-9]' when ever a client enters the wrong SSN format such as 575-444865. I used the t-sql statement below but does not work when running an insert on the authors table ; au_id column.
CREATE TRIGGER trg_datavalidate ON authors FOR INSERT AS DECLARE @au_id varchar(11) DECLARE @err INT
SELECT @err = @@ERROR from inserted IF @err = 547 BEGIN PRINT 'Au_id needs to be in the SSN format xxx-xx-xxxx!. Error Number:' + CAST(@err AS VARCHAR) RAISERROR ('au_id must be in the format of xxx-xxxxxx where x is a number.', -- Message text. 16, -- Severity. 1 -- State. ); ROLLBACK TRANSACTION END
Hi there. I really hope somebody can point out what's going wrong here..
Firstly, what I'm trying to do is ensure that when a user adds a row to one of my tables, lets call it a WorkDateRange table, that the dates entered never overlap for the same work.
This constraint needs to be created at the same time the Database is created. I'm using a function in the check constraint that is also created when the DB is.
This table will store types of work as an Int along with a start date and an end date for the range. eg. 9999 2008/04/01 2008/04/22, that would be a work type of 9999 and a date range of 2008/04/01 - 2008/04/22. Therefore a user should not be able to enter this as the next row entry, 9999 2008/04/12 2008/04/30, without violating the check constraint. Now thats all good in theory but in practise I just can't get it!
Here is the code I am using:
~first the DB is created~
<now the Function>
CREATE FUNCTION WorkDateRange_CheckDateOverlapping ( @Work INT, @Date DATETIME ) RETURNS BIT AS BEGIN DECLARE @LogicalValue BIT, @StartDate DATETIME, @EndDate DATETIME
DECLARE WorkDateRange_Cursor CURSOR FOR SELECT StartDateRange, EndDateRange FROM WorkDateRange WHERE Work = @Work
SET @LogicalValue = 1
OPEN WorkDateRange_Cursor FETCH NEXT FROM WorkDateRange_Cursor INTO @StartDate, @EndDate WHILE @@FETCH_STATUS = 0 BEGIN SELECT @LogicalValue = CASE WHEN @Date BETWEEN @StartDate AND @EndDate THEN 0 ELSE 1 END IF @LogicalValue = 0 BREAK
FETCH NEXT FROM WorkDateRange_Cursor INTO @StartDate, @EndDate END
CLOSE WorkDateRange_Cursor DEALLOCATE WorkDateRange_Cursor
RETURN @LogicalValue END GO
<Then the table is created with these columns and these constraints on StartDateRange and EndDateRange>
Columns: [UID] BIGINT, Work INT, StartDateRange DATETIME, EndDateRange DATETIME
When I create the database and tables all is successful, but when I try enter rows into the WorkDateRange table, I get a message that my check constraint is violated. But if I copy my code into a separate query and declare the Work and Date variables and assign them the values that would be assigned during the check. I get the desired result of 1, which should be passing the check.
Any help would be greatly appreciated Thanks in Advance.