--1. 按拼音排序 DECLARE @t TABLE(col varchar(2)) INSERT @t SELECT '中' UNION ALL SELECT '国' UNION ALL SELECT '人'SELECT * FROM @t ORDER BY col COLLATE Chinese_PRC_CS_AS_KS_WS /*--结果 col ---- 国 人 中 --*/ GO
create table t1(id int,val varchar(10)) go create trigger trig1 on t1 for insert as update t1 set val = upper(val) goinsert t1 select 2,'abC怎么写' select * from t1 /* id val ----------- ---------- 2 ABC怎么写(所影响的行数为 1 行) */
DECLARE @t TABLE(v VARCHAR(100)) INSERT @t SELECT 'a' UNION ALL SELECT 'A' SELECT * FROM @t WHERE v COLLATE Chinese_PRC_CS_AS_KS_WS = 'A' IF object_id('tb','u') IS NOT NULL DROP TABLE tb GOCREATE TABLE tb(v VARCHAR(100) COLLATE Chinese_PRC_CS_AS_KS_WS CHECK(v = UPPER(v))) GOINSERT tb SELECT 'a' GO /* 服务器: 消息 547,级别 16,状态 1,行 1 INSERT 语句与 COLUMN CHECK 约束 'CK__tb__v__6518A21F' 冲突。该冲突发生于数据库 'tst',表 'tb', column 'v'。 语句已终止。*/ --新开一窗口执行 INSERT tb SELECT 'A' SELECT * FROM tb /* A */
若不想在 v 列上指定排序规则,即不把排序规则Chinese_PRC_CS_AS_KS_WS定义到表结构上,那么稍做调整 : DECLARE @t TABLE(v VARCHAR(100)) INSERT @t SELECT 'a' UNION ALL SELECT 'A' SELECT * FROM @t WHERE v COLLATE Chinese_PRC_CS_AS_KS_WS = 'A' IF object_id('tb','u') IS NOT NULL DROP TABLE tb GOCREATE TABLE tb(v VARCHAR(100) CHECK(v COLLATE Chinese_PRC_CS_AS_KS_WS = UPPER(v COLLATE Chinese_PRC_CS_AS_KS_WS))) GOINSERT tb SELECT 'a' GO /* 服务器: 消息 547,级别 16,状态 1,行 1 INSERT 语句与 COLUMN CHECK 约束 'CK__tb__v__6518A21F' 冲突。该冲突发生于数据库 'tst',表 'tb', column 'v'。 语句已终止。*/ --新开一窗口执行 INSERT tb SELECT 'A' SELECT * FROM tb /* A */
create table tb(v varchar(50) check(ascii(left(v,1)) between 65 and 90)) --失败 insert into tb select 'abc' --成功 insert into tb select 'Abc'ascii码
楼主没有说首字母,所以如果以ascii来处理的话,应该是在check中调用函数,逐个字符去识别ascii,但不是between and,而是 not between and a-z所在的ascii码段。仅供参考,呵
Oracle 已经实现SQL 与正则表达式的方式,SQL Server 不太清楚。以为Oracle Script 代供你参考。 ALTER TABLE EMP ADD CONSTRAINT REGEX01 CHECK (REGEXP_LIKE(ENAME,'^[[:alpha:]]+$'));
insert @t select upper('好的abcde啊')
select * from @t
Name
----------------------------------------------------------------------------------------------------
好的ABCDE啊(所影响的行数为 1 行)
所以只能通过ASC码来判断.
可以这样建约束ALTER TABLE 你的表名
ADD CONSTRAINT CK_Test
CHECK(你要约束的列 like '[^a-z]')
循环遍历字符串,如果发现有小写的a-z(可通过ASC码和大写的区分),则抛出异常.
DECLARE @t TABLE(col varchar(2))
INSERT @t SELECT '中'
UNION ALL SELECT '国'
UNION ALL SELECT '人'SELECT * FROM @t ORDER BY col COLLATE Chinese_PRC_CS_AS_KS_WS
/*--结果
col
----
国
人
中
--*/
GO
create table t1(id int,val varchar(10))
go
create trigger trig1
on t1
for insert
as
update t1 set val = upper(val)
goinsert t1 select 2,'abC怎么写'
select * from t1
/*
id val
----------- ----------
2 ABC怎么写(所影响的行数为 1 行)
*/
INSERT @t SELECT 'a'
UNION ALL SELECT 'A'
SELECT * FROM @t WHERE v COLLATE Chinese_PRC_CS_AS_KS_WS = 'A'
IF object_id('tb','u') IS NOT NULL
DROP TABLE tb
GOCREATE TABLE tb(v VARCHAR(100) COLLATE Chinese_PRC_CS_AS_KS_WS CHECK(v = UPPER(v)))
GOINSERT tb SELECT 'a'
GO
/*
服务器: 消息 547,级别 16,状态 1,行 1
INSERT 语句与 COLUMN CHECK 约束 'CK__tb__v__6518A21F' 冲突。该冲突发生于数据库 'tst',表 'tb', column 'v'。
语句已终止。*/
--新开一窗口执行
INSERT tb SELECT 'A'
SELECT * FROM tb
/*
A
*/
DECLARE @t TABLE(v VARCHAR(100))
INSERT @t SELECT 'a'
UNION ALL SELECT 'A'
SELECT * FROM @t WHERE v COLLATE Chinese_PRC_CS_AS_KS_WS = 'A'
IF object_id('tb','u') IS NOT NULL
DROP TABLE tb
GOCREATE TABLE tb(v VARCHAR(100) CHECK(v COLLATE Chinese_PRC_CS_AS_KS_WS = UPPER(v COLLATE Chinese_PRC_CS_AS_KS_WS)))
GOINSERT tb SELECT 'a'
GO
/*
服务器: 消息 547,级别 16,状态 1,行 1
INSERT 语句与 COLUMN CHECK 约束 'CK__tb__v__6518A21F' 冲突。该冲突发生于数据库 'tst',表 'tb', column 'v'。
语句已终止。*/
--新开一窗口执行
INSERT tb SELECT 'A'
SELECT * FROM tb
/*
A
*/
--失败
insert into tb select 'abc'
--成功
insert into tb select 'Abc'ascii码
ALTER TABLE EMP ADD CONSTRAINT REGEX01
CHECK (REGEXP_LIKE(ENAME,'^[[:alpha:]]+$'));