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-存储过程 的相关文章

  • SQL Server递归查询显示父级路径

    我正在使用 SQL Server 语句并有一张表 例如 item value parentItem 1 2test 2 2 3test 3 3 4test 4 5 1test 1 6 3test 3 7 2test 2 我想使用 SQL S
  • 如何对 SQL Server Express 进行实时更改

    我一直在使用 VS studio 开发一个 ASP NET Web 应用程序 我正在使用 SQL Server Express 在开发过程中 我一直在我的服务器上测试我的网络应用程序 每次我需要更新数据库时 我都会简单地删除旧数据库 位于我
  • 按两列的最小值排序

    I use SQL Server 2008 R2 我需要按两列的最小值对表进行排序 该表如下所示 ID integer Date1 datetime Date2 datetime 我希望我的数据按至少两个日期排序 以这种方式对该表进行排序的
  • 自动创建n列表

    我想在一行中将 236 个 int 值存储到 sql 中 现在我必须声明该表 但我不想输入 236 倍的列名 列名应该是 BYTE001 BYTE002 或其他前缀 如 BYTE B INT 可以自动生成ColumnNames吗 我尝试以下
  • 在 Sql Server 中启用 DTD 支持

    我有各种 xml 文档需要存储在数据库列中 这些文档包含对 DTD 的引用 并且 SQL Server 不会导入 xml 因为它存在安全风险 如何在数据库上启用 DTD 支持 以便它可以让我插入 xml 内容 你必须CONVERT首先 MS
  • 将 5 gig 文件导入表时出错

    我正在尝试批量插入表 use SalesDWH go BULK INSERT dbo npi FROM S tmp npi csv WITH FIELDTERMINATOR ROWTERMINATOR n lastrow 200 first
  • 临时表上没有外键限制? SQL Server 2008

    我知道临时表只会在 SQL Server 会话打开时存在 但为什么不能对它们进行外键限制呢 想象一下这样的场景 您创建从临时表到具体表的键的外键关系 外键关系的限制之一是您无法从临时表所依赖的键表中删除行 现在 通常当您创建外键关系时 您知
  • 使用 MVC5、Ajax、C# 和 MSSQL Server 级联 DropdownList

    我对来自 Windows 窗体和三层架构的 MVC 非常陌生 我试图找出使用从数据库填充的级联下拉列表 DDL 我使用 MS SQL Server 2012 VS 2013 目前我正在研究用户调查问卷 用户可以从 DDL 的多个答案中进行选
  • 在为存储过程设置参数时,可以在 new SqlParameter 的构造函数中设置 TypeName 吗?

    我使用以下代码来设置调用存储过程的参数 List
  • 在sql server中动态生成列名

    请看下面的查询 select name as Employee Name from table name 我想生成 Employee Name 动态地基于其他列值 这是示例表 s dt dt01 dt02 dt03 2015 10 26 I
  • SQL Server - 即使在回滚的情况下如何确保标识字段正确增加

    在 SQL Server 中 如果涉及插入新行的事务被回滚 则标识字段中的数字将被跳过 例如 如果Foos表是99 然后我们尝试插入一个新的Foo记录但回滚 然后 ID 100 被 用完 下一个Foo行编号为 101 有什么方法可以改变这种
  • SQL Server 2017 快速安装失败

    我尝试在 Windows 10 上安装 SQL Server 2017 Express 但失败 这是失败后向我显示的详细信息 Action required Use the following information to resolve
  • SQL Server 'FETCH FIRST 1 ROWS ONLY' 无效使用

    我正在尝试将 Db2 查询转换为 SQL Server 我遇到了一个我不熟悉的构造 仅 FETCH FIRST 1 ROWS 这是在 db2 上运行的查询 select from products series where state xx
  • SQL:删除SQL Server中的重复记录

    我有一个 sql server 数据库 我预先加载了大量数据行 不幸的是 数据库中没有主键 并且表中现在存在重复信息 我不担心没有主键 但我担心数据库中有重复项 有什么想法吗 原谅我是一个sql server新手 嗯 这就是表上应该有主键的
  • 如何返回调用不同数据库中的存储过程的远程数据库名称?

    我在一个 SQL Server 2008 R2 上有许多不同的数据库 为了便于论证 我们将它们称为 DB A DB B 和 DB C 我被要求开发一个将存在于 DB A 上的存储过程 该存储过程将用于删除和创建索引 并在 DB A 的表中存
  • 嵌套 linq 查询上的“列名 [ColumnName] 无效”

    最后更新 经过大量测试后 我意识到 如果我对 SQL 2000 和 SQL 2005 上的同一数据集 在本例中为 Northwind 表运行相同的查询 我会得到两个不同的结果 在 SQL 2000 上 我收到问题中的错误 在 SQL 200
  • 查看与存储过程连接的结果

    我在 SQL Server 中有一个由应用程序使用的现有视图 我需要加入从存储过程返回的表 存储过程会执行很多操作 例如在返回结果之前插入多个 temp 表 我尝试将存储过程转换为表值函数 但是插入 TVF 内的临时表会导致编译错误 我还有
  • 无法找到请求的.Net Framework 数据提供程序。 (Sql客户端)

    我正在尝试使用来自 SQL Server 2005 的 DB First 迁移来设置一个简单的 ASP NET MVC 4 Web 应用程序 我已经在数据库中创建了表 并使用实体框架在代码中创建了对象 我可以使用这些对象访问数据 当我尝试使
  • SQL Server中根据条件进行计数

    有谁知道如何在 SQL Server 中根据条件进行计数 Example 如何对表中名称为 system 的记录以及 CaseID 记录总数进行列计数 顾客表 UserID CaseID Name 1 100 alan 1 101 alan
  • T-SQL:检查电子邮件格式

    我有这样的场景 我需要物理数据库中的数据完整性 例如 我有一个变量 email address VARCHAR 200 我想检查一下值是否为 email address是电子邮件格式 有人知道如何检查 T SQL 中的格式吗 非常感谢 我使

随机推荐

  • 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