sqlserver-存储过程

2023-12-18

sqlserver代码格式化网站

https://www.dpriver.com/pp/sqlformat.htm

存储过程中的SET ANSI_NULLS ON有什么用?

1)SET ANSI_NULLS ON:null与null不相等

2)SET ANSI_NULLS OFF:null与null相等

最后,如果开启了SET ANSI_NULLS ON,想要判断是不是为null,该怎么判断呢?这个时候可以使用is null,也可以使用isnull()函数判断null以及空白。

存储过程中SET QUOTED_IDENTIFIER ON有什么用?

1)SET QUOTED_IDENTIFIER ON:与系统关键字重复的,允许使用双引号括起来,就能正常使用。注意是双引号

2)SET QUOTED_IDENTIFIER OFF:与系统关键字重复的,不允许使用

if @@error <> 0是什么意思

@@error表示上一条SQL语句执行结果是否有错,如果@@error的值不等于0,即是出错的情况就要采取措施,比如回滚。

临时表

这是创建临时表的语法。以下为SQL使用帮助中关于临时表的说明:
可以创建本地和全局临时表。本地临时表仅在当前会话中可见;全局临时表在所有会话中都可见。
本地临时表的名称前面有一个编号符 (#table_name),而全局临时表的名称前面有两个编号符 (##table_name)。
除非使用 DROP TABLE 语句显式除去临时表,否则临时表将在退出其作用域时由系统自动除去:
当存储过程完成时,将自动除去在存储过程中创建的本地临时表。由创建表的存储过程执行的所有嵌套存储过程都可以引用此表。但调用创建此表的存储过程的进程无法引用此表。
所有其它本地临时表在当前会话结束时自动除去。
全局临时表在创建此表的会话结束且其它任务停止对其引用时自动除去。任务与表之间的关联只在单个 Transact-SQL 语句的生存周期内保持。换言之,当创建全局临时表的会话结束时,最后一条引用此表的 Transact-SQL 语句完成后,将自动除去此表。

在指定数据库xxx中创建查看死锁的存储过程

这个是一个在用的sp

USE [xxx]

go

/****** Object:  StoredProcedure [dbo].[sp_who_lock]    Script Date: 2022/7/8 9:35:49 ******/
SET ansi_nulls ON

go

SET quoted_identifier ON

go

ALTER PROCEDURE [dbo].[Sp_who_lock]
AS
  BEGIN
      DECLARE @spid INT
      DECLARE @blk INT
      DECLARE @count INT
      DECLARE @index INT
      DECLARE @lock TINYINT

      SET @lock=0

      CREATE TABLE #temp_who_lock
        (
           --自增字段
           id   INT IDENTITY(1, 1),   
           spid INT,
           blk  INT
        )
	  --@@error表示上一条SQL语句执行结果是否有错,如果@@error的值不等于0,即是出错的情况就要采取措施,比如回滚。
      IF @@error <> 0
        RETURN @@error

      INSERT INTO #temp_who_lock
                  (spid,
                   blk)
      SELECT 0,
             blocked
      FROM   (SELECT *
              FROM   master..sysprocesses
              WHERE  blocked > 0)a
      WHERE  NOT EXISTS(SELECT *
                        FROM   master..sysprocesses
                        WHERE  a.blocked = spid
                               AND blocked > 0)
      UNION
      SELECT spid,
             blocked
      FROM   master..sysprocesses
      WHERE  blocked > 0

      IF @@error <> 0
        RETURN @@error

      SELECT @count = Count(*),
             @index = 1
      FROM   #temp_who_lock

      IF @@error <> 0
        RETURN @@error

      IF @count = 0
        BEGIN
            SELECT '没有阻塞和死锁信息'

            RETURN 0
        END

      WHILE @index <= @count
        BEGIN
            IF EXISTS(SELECT 1
                      FROM   #temp_who_lock a
                      WHERE  id > @index
                             AND EXISTS(SELECT 1
                                        FROM   #temp_who_lock
                                        WHERE  id <= @index
                                               AND a.blk = spid))
              BEGIN
                  SET @lock=1

                  SELECT @spid = spid,
                         @blk = blk
                  FROM   #temp_who_lock
                  WHERE  id = @index

                  SELECT '引起数据库死锁的是: '
                         + Cast(@spid AS VARCHAR(10))
                         + '进程号,其执行的SQL语法如下'

                  SELECT @spid,
                         @blk

                  DBCC inputbuffer(@spid)

                  DBCC inputbuffer(@blk)
              END

            SET @index=@index + 1
        END

      IF @lock = 0
        BEGIN
            SET @index=1

            WHILE @index <= @count
              BEGIN
                  SELECT @spid = spid,
                         @blk = blk
                  FROM   #temp_who_lock
                  WHERE  id = @index

                  IF @spid = 0
                    SELECT '引起阻塞的是:'
                           + Cast(@blk AS VARCHAR(10))
                           + '进程号,其执行的SQL语法如下'
                  ELSE
                    SELECT '进程号SPID:'
                           + Cast(@spid AS VARCHAR(10)) + '被'
                           + '进程号SPID:'
                           + Cast(@blk AS VARCHAR(10))
                           + '阻塞,其当前进程执行的SQL语法如下'

                  DBCC inputbuffer(@spid)

                  DBCC inputbuffer(@blk)

                  SET @index=@index + 1
              END
        END

      DROP TABLE #temp_who_lock

      RETURN 0
  END 


以下为另外一种方法:

在master中创建查看死锁的存储过程

IF EXISTS (SELECT *
           FROM   dbo.sysobjects
           WHERE  id = Object_id(N'[dbo].[sp_who_lock]')
                  AND Objectproperty(id, N'IsProcedure') = 1)
  DROP PROCEDURE [dbo].[sp_who_lock]

go

USE master

go

CREATE PROCEDURE Sp_who_lock
AS
  BEGIN
      DECLARE @spid                       INT,
              @bl                         INT,
              @intTransactionCountOnEntry INT,
              @intRowcount                INT,
              @intCountProperties         INT,
              @intCounter                 INT

      CREATE TABLE #tmp_lock_who
        (
           id   INT IDENTITY(1, 1),
           spid SMALLINT,
           bl   SMALLINT
        )

      IF @@ERROR <> 0
        RETURN @@ERROR

      INSERT INTO #tmp_lock_who
                  (spid,
                   bl)
      SELECT 0,
             blocked
      FROM   (SELECT *
              FROM   sysprocesses
              WHERE  blocked > 0) a
      WHERE  NOT EXISTS(SELECT *
                        FROM   (SELECT *
                                FROM   sysprocesses
                                WHERE  blocked > 0) b
                        WHERE  a.blocked = spid)
      UNION
      SELECT spid,
             blocked
      FROM   sysprocesses
      WHERE  blocked > 0

      IF @@ERROR <> 0
        RETURN @@ERROR

      -- 找到临时表的记录数
      SELECT @intCountProperties = Count(*),
             @intCounter = 1
      FROM   #tmp_lock_who

      IF @@ERROR <> 0
        RETURN @@ERROR

      IF @intCountProperties = 0
        SELECT '现在没有阻塞和死锁信息' AS message

      -- 循环开始
      WHILE @intCounter <= @intCountProperties
        BEGIN
            -- 取第一条记录
            SELECT @spid = spid,
                   @bl = bl
            FROM   #tmp_lock_who
            WHERE  id = @intCounter

            BEGIN
                IF @spid = 0
                  SELECT '引起数据库死锁的是: '
                         + Cast(@bl AS VARCHAR(10))
                         + '进程号,其执行的SQL语法如下'
                ELSE
                  SELECT '进程号SPID:'
                         + Cast(@spid AS VARCHAR(10)) + '被'
                         + '进程号SPID:'
                         + Cast(@bl AS VARCHAR (10))
                         + '阻塞,其当前进程执行的SQL语法如下'

                DBCC inputbuffer (@bl )
            END

            -- 循环指针下移
            SET @intCounter = @intCounter + 1
        END

      DROP TABLE #tmp_lock_who

      RETURN 0
  END 

在master中创建删除指定数据库的死锁的存储过程

USE master

go

IF EXISTS (SELECT *
           FROM   dbo.sysobjects
           WHERE  id = Object_id(N'[dbo].[p_killspid]')
                  AND Objectproperty(id, N'IsProcedure') = 1)
  DROP PROCEDURE [dbo].[p_killspid]

go

CREATE PROC P_killspid @dbname VARCHAR(200) --要关闭进程的数据库名  
AS
    DECLARE @sql NVARCHAR(500)
    DECLARE @spid NVARCHAR(20)
    DECLARE #tb CURSOR FOR
      SELECT spid=Cast(spid AS VARCHAR(20))
      FROM   master..sysprocesses
      WHERE  dbid = Db_id(@dbname)

    OPEN #tb

    FETCH next FROM #tb INTO @spid

    WHILE @@fetch_status = 0
      BEGIN
          EXEC('kill '+@spid)

          FETCH next FROM #tb INTO @spid
      END

    CLOSE #tb

    DEALLOCATE #tb

go 

查看死锁

exec master..sp_who_lock

删除死锁

exec master..p_killspid 'xxx'

xxx 产生死锁的数据库名

测试死锁

创建测试数据

CREATE TABLE Lock1(C1 int default(0));
CREATE TABLE Lock2(C1 int default(0));
INSERT INTO Lock1 VALUES(1);
INSERT INTO Lock2 VALUES(1);

开两个查询窗口,分别执行下面两段sql

--Query 1
Begin Tran
Update Lock1 Set C1=C1+1;
WaitFor Delay '00:01:00';
SELECT * FROM Lock2
Rollback Tran;
 
 
--Query 2
Begin Tran
Update Lock2 Set C1=C1+1;
WaitFor Delay '00:01:00';
SELECT * FROM Lock1
Rollback Tran;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

sqlserver-存储过程 的相关文章

  • 存储过程和权限 - EXECUTE 就足够了吗?

    我有一个 SQL Server 2008 数据库 其中对基础表的所有访问都是通过存储过程完成的 一些存储过程只是从表中选择记录 而其他存储过程则进行 UPDATE INSERT 和 DELETE 如果存储过程更新表 执行存储过程的用户是否也
  • 列中差异的数量

    我想检索一列每行中有多少个字母的差异 例如 如果您有一个值 test 而另一行有一个值 testing 则 test 和 testing 之间的差异为 4 个字母 该列的数据值为 4 I have reflected about it an
  • 对多个数据库执行 SQL 查询

    我知道我的帖子与该论坛中的其他帖子的标题非常相似 但我真的找不到我需要的答案 这是我的问题 我的 Windows Server 上运行着 SQL Server 在我的 SQL Server 中 我有大约 30 个数据库 它们都具有相同的表和
  • 选择具有 SQL Server XML 列类型的特定行

    我正在尝试从类似于以下定义的表中选择数据 Column Data Type Id Int DataType Int LoggedData XML 但我只想选择具有特定 DataType 值并且在 LoggedData 列中包含字符串 或评估
  • 为什么 SqlClient 在传递 SqlXml 时使用不必要的 XML 转换?

    我有一个关于从 C 代码将 xml 数据类型传递给查询的问题 首先 这是 SQL Server 上的一个表 CREATE TABLE dbo XmlTable id int IDENTITY 1 1 NOT NULL dat xml NOT
  • 在 C#.NET 应用程序中使用 SQL Server 时间数据类型?

    如何使用 SQLtimeSQL Server 2008 中 C NET 中引入的数据类型 我一直在努力让它发挥作用 但没有成功 这是一个MSDN 文章 http msdn microsoft com en us library bb6751
  • 如何跨多个表强制执行 CHECK 约束

    我有一个在 Microsoft SQL Server 2012 Express 中记录奶牛繁殖信息的数据库 显然 一头牛只有在出生后才能配种 并且在其一生中可能会配种多次 我需要在我的数据库中强制执行这些约束 我目前已经根据下图安排了一个架
  • VB6+SQL-Server:如何使用 ADODB.Command 执行带有命名参数的查询?

    我一直在尝试使用 ADODB Command 执行参数化查询 我知道我可以使用 对于参数 但我的查询相当大 我真的不想跟踪参数的确切顺序 我尝试了类似以下的操作 objCmd CommandType adCmdText objCmd Com
  • 优化 SQL Server 上的删除

    Deletesql server 上的有时很慢 我经常需要优化它们以减少所需的时间 我一直在谷歌上搜索一些关于如何做到这一点的提示 并且我发现了各种各样的建议 我想知道你最喜欢和最有效的驯服删除野兽的技术 以及它们如何以及为什么起作用 到目
  • 在 SQL 中将数字求小数次幂

    我试图在 MS SQL 中将一系列数字求小数 1 5 次幂 但在应用于负基数时出现 域错误 这应该不是问题 因为我要提升到奇次幂根 此外 我可以在 Excel 中进行计算 谁能评论一下 MS SQL 是否根本不支持将负幂提高到小数根 负基数
  • 在 C# 中读取大型 SQL 脚本文件

    我正在尝试阅读一个大脚本 到目前为止我已经尝试了两种选择 选项1 由于内存空间不足的问题 我们无法在SQL Management Studio中打开大型脚本文件 所以最初我使用sqlcmd在远程主机上执行 160 mb SQL 脚本文件 5
  • 同时使用 GUID 和自动递增整数

    我一直在研究使用 GUID 作为数据库中的主键 到目前为止 利似乎大于弊 然而 我发现 GUID 可能不是我想要的 在我的应用程序中 用户应该能够根据用户友好的 ID 来识别对象 因此 例如 如果他们想要获取特定产品而不输入全名 则可以使用
  • “作为自身执行”与跨数据库视图

    SQL Server 2016 数据库中有一个视图A从另一个数据库中的表中进行选择 B use A go create view TheView as select from B dbo SomeTable 我有 dbo 访问权限B数据库
  • 如何使用 Windows 身份验证指定 Windows 用户从 ASP 连接到 MS SQL Server 数据库

    我已经尝试了一个多月的时间来将这里的 ASP 脚本连接到 SQL Server 数据库 但每次我使用这个连接字符串时 Data Source dbServer01 Initial Catalog POS123 Integrated Secu
  • T-SQL:用最新的非空值替换 NULL 的最佳方法?

    假设我有这张表 id value 1 5 2 4 3 1 4 NULL 5 NULL 6 14 7 NULL 8 0 9 3 10 NULL 我想编写一个查询来替换任何NULL值与表中最后一个不为空的值在那一栏里 我想要这个结果 id va
  • 删除数据库中的行后如何重新排序ID

    我正在使用 C 来制作具有 sql 数据库的程序 在数据库中我有一个名为Workers 它有一个自动增量和主键ID column 当我删除一条记录时 ID 之间会出现间隙 删除记录后如何重新排序 ID UPDATE 我要做的就是找到记录后将
  • 如何在 SQL Server 中连接

    我的数据库没有特定的列 因此我通过开关在查询中创建了一个列 我需要的是将此列与数据库中的另一列连接起来 select certificateDuration DurationType case when certificateDuratio
  • 通知设置的数据库设计

    用户可以打开或关闭 他的通知设置 帐户 用于通知 例如 更改帐户资料信息 收到新消息等 通知可以通过电子邮件或手机 推送或短信 发送 用户可以只有 1 封电子邮件和多个手机设备 有什么方法可以改进以下数据库设计或者您会采取不同的方式吗 让我
  • 我可以从 SQL Server 读取元数据来了解最后更改的行/表吗?

    我们有一个数据库hundreds的桌子 有没有某种metaSQL Server 中的数据源 我可以以编程方式查询以获取名称最后更改表和行 或者我们是否需要实施这个我们自己每个表中的字段称为上次更改日期时间 etc 就查明表最后一次修改的时间
  • 从 Sharepoint 到 SQL Server 的实时同步

    我见过许多将 SQL Server 数据同步到 SharePoint 的解决方案 但没有见过将 SharePoint 列表同步到 SQL Server 的解决方案 有谁知道解决方案吗 商业化就好了 或者 我需要编写一个 Web 部件来创建多

随机推荐

  • Win7系统提示找不到dmintf.dll文件的解决办法

    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题 如果是新手第一时间会认为是软件或游戏出错了 其实并不是这样 其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库 这时你可以下载这个dmintf
  • 万文详解JUC(超详细)

    生命无罪 健康万岁 我是laity 我曾七次鄙视自己的灵魂 第一次 当它本可进取时 却故作谦卑 第二次 当它在空虚时 用爱欲来填充 第三次 在困难和容易之间 它选择了容易 第四次 它犯了错 却借由别人也会犯错来宽慰自己 第五次 它自由软弱
  • Win7系统提示找不到dmdskres.dll文件的解决办法

    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题 如果是新手第一时间会认为是软件或游戏出错了 其实并不是这样 其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库 这时你可以下载这个dmdskre
  • Win7系统提示找不到dmdskres2.dll文件的解决办法

    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题 如果是新手第一时间会认为是软件或游戏出错了 其实并不是这样 其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库 这时你可以下载这个dmdskre
  • Win7系统提示找不到dmdskmgr.dll文件的解决办法

    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题 如果是新手第一时间会认为是软件或游戏出错了 其实并不是这样 其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库 这时你可以下载这个dmdskmg
  • STM32F103概要

    The STM32F103x4 STM32F103x6 STM32F103xC STM32F103xD and STM32F103xE are a drop in replacement for STM32F103x8 B medium d
  • Win7系统提示找不到dmdlgs.dll文件的解决办法

    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题 如果是新手第一时间会认为是软件或游戏出错了 其实并不是这样 其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库 这时你可以下载这个dmdlgs
  • Win7系统提示找不到dispex.dll文件的解决办法

    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题 如果是新手第一时间会认为是软件或游戏出错了 其实并不是这样 其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库 这时你可以下载这个dispex
  • 最具挑战的骑行路线

    1 318川藏线 2 独库公路 561公里 3 珠峰尼泊尔 1000公里 4 沙漠公路 1800公里 5 219新藏线 2500公里 下面是一些别人的骑行记录 证书或奖牌 参考 1 抖音 Max骑行玩家 https v douyin com
  • 【贪心算法】【中位贪心】LeetCode:100123.执行操作使频率分数最大

    涉及知识点 双指针 C 算法 前缀和 前缀乘积 前缀异或的原理 源码及测试用例 包括课程视频 贪心算法 题目 给你一个下标从 0 开始的整数数组 nums 和一个整数 k 你可以对数组执行 至多 k 次操作 从数组中选择一个下标 i 将 n
  • sqlserver同步-日志传送

    先决条件 主数据库必须使用 完整恢复模式或大容量日志恢复模式 将数据库切换为简单恢复模式会导致日志传送停止工作 在配置日志传送之前 您 必须创建共享 以便辅助服务器可以访问事务日志备份 这是对生成事务日志备份的目录的共享 例如 如果将事务日
  • RFID工业识别系统的优势和价值

    RFID是物联网感知层最重要的组成部分之一 它可以通过感知物品来实现智能化识别和管理 实现不同设备之间的互联 本文将深入探讨RFID工业识别系统的优势和价值 并探讨其实际应用的案例情况 RFID工业识别系统的优势和价值 RFID作为物联网感
  • ubuntu22安装python3虚拟环境

    文章目录 安装python虚拟环境工具venv 创建项目根目录 创建虚拟环境 开启虚拟环境 安装项目依赖 退出虚拟环境 安装python虚拟环境工具venv 选择合适版本 root gslserver sudo apt install py
  • 向华为学习:基于BLM模型的战略规划研讨会实操的详细说明,含研讨表单(三)

    岁末年初 公司如何做战略规划 用华为和许多标杆企业在用的BLM模型来组织战略规划研讨会是一种行之有效的结构化方法 前面两篇文章 华研荟结合自己的经验和实践 详细介绍了基于BLM模型的战略规划研讨会的设计和组织流程 以及战略研讨会开始前的准备
  • 工业RFID读写器性能参数解析

    工业RFID读写器的性能参数主要有以下几项 工作频率 输出功率 输出接口 读写器类型 工作方式 读写器优先或电子标签优先等 1 工作频率 RFID读写器的工作频率是指其工作的频率范围 通常由读写器的工作频率决定 同时要与电子标签的工作频率保
  • postgresql安装

    这里写自定义目录标题 准备主机环境 配置网卡 关闭selinux 关闭防护墙 yum安装pg 登陆官网 安装yum源 安装12版本pg
  • 题解 | #平均活跃天数和月活人数#

    金融科技岗分享 欢聚shopline 凉 又遇毁到offer 爱奇艺互动产品运营实习面经 百度大搜2024校招补录 搜索时效性团队工作职责 1 通过query理解 召回 排序全链路的优化 持续优化百度搜索时效排序效果2 持续探索落地最前沿的
  • windows netstat命令

    前言 Netstat是控制台命令 是一个监控TCP IP网络的非常有用的工具 它可以显示路由表 实际的网络连接以及每一个网络接口设备的状态信息 Netstat用于显示与IP TCP UDP和ICMP协议相关的统计数据 一般用于检验本机各端口
  • 机器配音效果很好的软件是什么?这篇文章告诉你

    听说你对ai配音工具感兴趣啊 那我来跟你说说 这些东西可真是让人大开眼界 你想象一下 用一款ai配音工具 你就可以变身为任何人 不需要真的买那些昂贵的化妆品和服装 也不需要练习无数个小时来模仿别人的声音 无论是制作幽默搞笑的配音 还是严肃正
  • sqlserver-存储过程

    sqlserver代码格式化网站 https www dpriver com pp sqlformat htm 存储过程中的SET ANSI NULLS ON有什么用 1 SET ANSI NULLS ON null与null不相等 2 S