create table Question --考题表,所有的考题都在这表里
(
QNo Nvarchar(20) not null,--考题编号(XZ0001、PD0001、JD0001、JS0001)
Qclass Nvarchar(20) not null, --考题类型(选择、判断、简答、计算)
--CHECK(QClass=N'选择' or Qclass=N'判断'or...)
Qdifficulty Nvarchar(5) null,--难度(难、中、易)
Qabout Nvarchar(10) null,--考察相关(变比、百分表、互感器。。。)
Qdegree int not null,--分值
Qdetail Nvarchar(256) not null,--考题详情(题目)
QoptionsA Nvarchar(100) null, --选项A,
QoptionsB Nvarchar(100) null, --选项B
QoptionsC Nvarchar(100) null, --选项C
QoptionsD Nvarchar(100) null, --选项D
Qanswer Nvarchar(500)--参考答案
primary key (QNo)
)
--主要问题如下:
1、对于主键Qno,如何实现前两位为字母由QClass确定,后四位为数字由0001+1递增;
2、对于QoptionA/B/C/D,如果QClass为‘选择’,那么QoptionA/B/C/D不为null,反之为null.
--先谢!

------解决思路----------------------
这个也许应该分表,拼表问题应该也不大,然后,这些东西明显要放到程序上处理
最后,你的代码简单看了下,没发现问题
有错误具体是啥呢
------解决思路----------------------
CREATE TRIGGER tr_Question_ins呃,试试这个
ON Question
INSTEAD OF INSERT
AS
BEGIN
INSERT INTO Question(QNo,Qclass,Qdifficulty,Qabout,Qdegree,Qdetail,QoptionsA,QoptionsB,QoptionsC,QoptionsD,Qanswer)
SELECT (CASE WHEN a.Qclass=N'选择' THEN 'XZ'
WHEN a.Qclass=N'判断' THEN 'PD'
WHEN a.Qclass=N'简答' THEN 'JD'
WHEN a.Qclass=N'计算' THEN 'JS'
END)+
RIGHT('000'+convert(varchar,ROW_NUMBER() OVER(PARTITION BY a.Qclass ORDER BY a.Qno)+b.Qno),4),a.Qclass,a.Qdifficulty,a.Qabout,a.Qdegree,a.Qdetail,a.QoptionsA,a.QoptionsB,a.QoptionsC,a.QoptionsD,a.Qanswer
FROM INSERTED a
JOIN (
SELECT Qclass,CONVERT(INT,RIGHT(MAX(QNo),4))QNo FROM Question GROUP BY Qclass
)b ON a.Qclass=b.Qclass
end
------解决思路----------------------
不是把这个触发器放程序,而是这个应该算是业务的东西,应该要放到程序里去判断处理
我觉得不应该把过多的业务逻辑放到数据库上
------解决思路----------------------
TO:#8 这个要放到ALTER TABLE Question 里
ALTER TABLE Question ADD CONSTRAINT [CK_Question_QclassAndABCD]
CHECK(Qclass=N'选择' AND QoptionsA IS NOT NULL AND QoptionsB IS NOT NULL AND QoptionsC IS NOT NULL AND QoptionsD IS NOT NULL)
OR (Qclass<>N'选择' AND QoptionsA IS NULL AND QoptionsB IS NULL AND QoptionsC IS NULL AND QoptionsD IS NULL)
------解决思路----------------------
数据库最好只是放数据的地方,数据库和程序各司其职~~
------解决思路----------------------
ALTER TABLE Question ADD CONSTRAINT [CK_Question_QclassAndABCD]没注意,那就在外面加个括号
CHECK((Qclass=N'选择' AND QoptionsA IS NOT NULL AND QoptionsB IS NOT NULL AND QoptionsC IS NOT NULL AND QoptionsD IS NOT NULL)
OR (Qclass<>N'选择' AND QoptionsA IS NULL AND QoptionsB IS NULL AND QoptionsC IS NULL AND QoptionsD IS NULL))