zoukankan      html  css  js  c++  java
  • sql中的常见报错;

    1.对于某些写的sql懒得判断的;

    SELECT * FROM sys_part WHERE part_no =(SELECT part_no FROM dbo.sys_part)  --字查询的结果存在多行
    Msg 512, Level 16, State 1, Line 1
    Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.

    对于错误代码:512  

       SELECT TOP 10 * from sys.messages  WHERE message_id =512  --可以查询到一些对于此错误的不同语言描述,不用翻译了;

    --对于sql中执行的sql语句记录可以用如下进行查询,不过对于上面的错误内容查询不出来.......:

    SELECT TOP 100
    ST.text AS '执行的SQL语句',
    QS.execution_count AS '执行次数',
    QS.total_elapsed_time AS '耗时',
    QS.total_logical_reads AS '逻辑读取次数',
    QS.total_logical_writes AS '逻辑写入次数',
    QS.total_physical_reads AS '物理读取次数',
    QS.creation_time AS '执行时间' ,
    QS.*
    FROM sys.dm_exec_query_stats QS
    CROSS APPLY
    sys.dm_exec_sql_text(QS.sql_handle) ST
    WHERE QS.creation_time BETWEEN '2019-03-01 00:00:00' AND '2019-04-02 11:00:00'
    ORDER BY
    qs.creation_time DESC

    2.对于语句没有异常处理的情况,多个sql写在一起抛给服务器会认为是独立的进行处理,如有异常不会终止,如下:

    --没有异常捕捉的情况

    PRINT 'first'

    SELECT 1/0

    PRINT 'second'

    --执行结果:

    first
    Msg 8134, Level 16, State 1, Line 3
    Divide by zero error encountered.
    second ----异常之后的语句依然执行了

    ---具有异常捕捉的,异常之后的语句可以停止执行

    BEGIN TRY
    PRINT 'first'
    SELECT 1/0
    PRINT 'second'  ---此语句不会执行;
    END TRY
    BEGIN CATCH
    PRINT ERROR_MESSAGE()
    END CATCH

    --执行结果 

    first

    (0 row(s) affected)
    Divide by zero error encountered.

    3.对于mssql中事务添加示例,尽量对于连贯的业务,如果要将逻辑写在数据库中的话,还是要采用事务的方式,防止发生异常后,数据错乱,导致问题更加验证;

    -------创建需要验证的表及其数据
    --CREATE TABLE temp_table
    --(
    -- id INT IDENTITY(1,1),
    -- actymd VARCHAR(10),
    -- acthms VARCHAR(10)
    --)

    --DECLARE @insert INT
    --SET @insert=1

    --WHILE(@insert <10)
    --BEGIN
    -- INSERT INTO dbo.temp_table
    -- ( actymd, acthms )
    -- VALUES (
    -- '', -- actymd - varchar(10)
    -- '' -- acthms - varchar(10)
    -- )
    -- SET @insert+=1;
    --END

    SELECT * FROM dbo.temp_table

    --update dbo.temp_table SET actymd ='' --每次验证执行完成,将数据作还原处理


    ---验证事务的会滚
    SET XACT_ABORT ON ---数据库这里也需要开启否则还是徒劳

    DECLARE @count INT

    DECLARE @indext INT

    SELECT @count=COUNT(*) FROM dbo.temp_table(NOLOCK)

    SET @indext =1;

    BEGIN TRY

    WHILE(@indext<@count)
    BEGIN
    IF(@indext<4) ---如果事务有效果,那么此处的设置导致temp_table只会被更新3行数据
    BEGIN
    SELECT 'ddd'
    UPDATE temp_table SET actymd='tt' WHERE id =@indext
    END
    ELSE
    BEGIN
    BEGIN TRAN --此处进行事务执行结果如图1 --此处对应注释执行结果如图2
    UPDATE temp_table SET actymd='tt_yichang' WHERE id =@indext
    UPDATE temp_table SET actymd='dddddddddddddddddddddddddddd' WHERE id =@indext --此处会执行错误
    COMMIT
    END

    SET @indext+=1;

    END
    END TRY
    BEGIN CATCH
    ROLLBACK
    SELECT ERROR_MESSAGE(),ERROR_NUMBER(),@indext


    END CATCH

    --图1 有事务的执行结果
    --id actymd acthms
    --1 tt
    --2 tt
    --3 tt
    --4
    --5
    --6
    --7
    --8
    --9

    --图2 没有事务的执行结果
    --id actymd acthms
    --1 tt
    --2 tt
    --3 tt
    --4 tt_yichang
    --5
    --6
    --7
    --8
    --9

  • 相关阅读:
    Maven配置始终获取最新版本
    使用SpringBoot
    SpringBoot文档综述
    35_方法的使用
    34_结构体指针类型的使用
    33_同名字段的使用
    32_匿名字段的使用
    31_结构体的使用
    30_map的使用
    29_猜字游戏
  • 原文地址:https://www.cnblogs.com/muzililong/p/10518656.html
Copyright © 2011-2022 走看看