SqlServer创建表,可能用到存储过程,大牛露个面,进来赐教啦!O(∩_∩)O哈哈~

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SqlServer创建表,可能用到存储过程,大牛露个面,进来赐教啦!O(∩_∩)O哈哈~相关的知识,希望对你有一定的参考价值。

create table Question --考题表,所有的考题都在这表里
(
QNo Nvarchar(20) not null,--考题编号(XZ0001、PD0001、JD0001、JS0001)//int identity(20140000,1),
Qclass Nvarchar(20) not null, --考题类型(选择、判断、简答、计算)//Qclass=N'女'
--CHECK(QClass=N'选择' or Qclass=N'判断')
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.
--先谢!
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
 

CREATE TRIGGER tr_Question_ins
ON Question
INSTEAD OF INSERT
AS
BEGIN
    INSERT INTO Question(各列名)
    SELECT (CASE WHEN Qclass=N'选择' THEN 'XZ'
    WHEN Qclass=N'判断' THEN 'PD'
    WHEN Qclass=N'简答' THEN 'JD'
    WHEN Qclass=N'计算' THEN 'JS'
    END)+
    RIGHT('000'+ROW_NUMBER() OVER(PARTITION BY a.Qclass ORDER BY a.Qno)+b.Qno,4),a.其他列 
    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

check约束,后两项自己补全

    CHECK((Qclass=N'选择' AND QoptionsA IS NOT NULL AND QoptionsB IS NOT NULL)
    OR (Qclass<>N'选择' AND QoptionsA IS NULL AND QoptionsB IS NULL)

参考技术A 这个最好使用TRIGER,INSERT时触发,自动编号。
INSERT时对于QoptionA/B/C/D的修改也是同样道理。追问

那些都忘的差不多了,我现在需要结果。能给个代码吗?谢谢!

追答

CREATE TRIGGER TRG_QUESTION
ON Question
FOR INSERT
AS
DECLARE @QNO NVARCHAR2(20),@QCLASS NVARCHAR2(20),
@OPTIONA NVARCHAR2(100),@OPTIONB NVARCHAR2(100),
@OPTIONC NVARCHAR2(100),@OPTIOND NVARCHAR2(100)

SELECT @QCLASS=QCLASS,@QOPTIONA=QOPTIONA,@QOPTIONB=QOPTIONA,
@QOPTIONC=QOPTIONC,@QOPTIOND=QOPTIOND FROM INSERTED
....... ----这里自己补

GO

参考技术B 可以加触发器来实现。或者写个存储来执行插入操作。看心情吧。追问

亲,你好!写个代码我看看好不好!谢谢了!

sqlserver 怎么看存储过程的上次执行时间

一般来说,最好记录日志(专门的日志表),日志中有datetime列

在存储过程执行前,记录一下日志、存储过程执行完,记录一下日志。

这样就可以计算其执行的时间了,

并且还可以在执行过程中记录一些重要的信息。
参考技术A 打开企业管理器--控制台目录—sqlserver 组—管理--SQL server日志 参考技术B 打开企业管理器--控制台目录—sqlserver 组—管理--SQL server日志 参考技术C  在“跟踪”  工具中,有专门的 可以查看。 参考技术D 你有表记录它每次的执行时间吗?

以上是关于SqlServer创建表,可能用到存储过程,大牛露个面,进来赐教啦!O(∩_∩)O哈哈~的主要内容,如果未能解决你的问题,请参考以下文章

关于sqlserver临时表的问题,请教高手!

sqlserver 2008 关于存储过程中的临时表。

关于sqlserver存储过程事务锁的问题

SqlServer存储过程

SQL SERVER如何查看一个表被哪些存储过程用到?用哪个系统存储过程?

Sqlserver存储过程返回表,如何实现?