Ø  T-SQL 编程是大多数程序员都会接触的,也是数据库编程必须掌握的技术。下面,是本人在工作或学习中积累的一些心得和技巧。主要包含以下内容:

1.   waitfor延时执行

2.   NOT 关键字的使用

3.   向变量赋值的 SELECT 语句,总是按照顺序赋值

4.   SET 与 SELECT 赋值的区别

5.   获取变量的数据类型

6.   一条 SQL 语句将一个字段的数据转为字符串

7.   根据起始和结束字符串,提取子字符串

8.   查询某数据库的所有存储过程中,是否包含指定的字符串

1.   waitfor延时执行,类似于定时器、休眠等

1)   延迟执行

WAITFOR DELAY 不在50~60之间

3.   向变量赋值的 SELECT 语句,总是按照顺序赋值

DECLARE

4.   SET 与 SELECT 赋值的区别

1)   SET 只能赋值一个变量,而 SELECT 可以赋值多个变量。

1.   SQL:

DECLARE @SetId int, @SelectId int, @SelectName varchar(20);

SET @SetId = (SELECT Id FROM (SELECT 1 AS Id, 'zhangsan' AS Name) AS T);

SELECT @SelectId = Id, @SelectName = Name FROM (SELECT 1 AS Id, 'zhangsan' AS Name) AS T;

SELECT @SetId AS SetId, @SelectId AS SelectId, @SelectName AS SelectName;

2.   结果:

2)   当返回多个值时,SET 不支持并且会报错;而 SELECT 不会,将赋值为最后一个值。

1.   SQL:

DECLARE @SetId int, @SelectId int, @SelectName varchar(20);

--SET @SetId = (SELECT Id FROM (SELECT 1 AS Id, 'zhangsan' AS Name UNION SELECT 2 AS Id, 'lisi' AS Name) AS T);

SELECT @SelectId = Id, @SelectName = Name FROM (SELECT 1 AS Id, 'zhangsan' AS Name UNION SELECT 2 AS Id, 'lisi' AS Name) AS T;

SELECT @SetId AS SetId, @SelectId AS SelectId, @SelectName AS SelectName;

2.   结果:

3)   没有记录返回时,SET 赋值为 NULL,而 SELECT 则保持原来的值。

1.   SQL:

DECLARE @SetId int = 10, @SelectId int = 10, @SelectName varchar(20) = 'original value';

SET @SetId = (SELECT Id FROM (SELECT 1 AS Id, 'zhangsan' AS Name) AS T WHERE 1 <> 1);

SELECT @SelectId = Id, @SelectName = Name FROM (SELECT 1 AS Id, 'zhangsan' AS Name) AS T WHERE 1 <> 1;

SELECT @SetId AS SetId, @SelectId AS SelectId, @SelectName AS SelectName;

2.   结果:

5.   获取变量的数据类型

SELECT Sql_Variant_Property(20, 'BaseType') AS Column1, Sql_Variant_Property(0.1, 'BaseType') AS Column2,Sql_Variant_Property(20 / 0.1, 'BaseType') AS Column3;

6.   SQL 语句将一个字段的数据转为字符串

DECLARE @Table1 TABLE(Name varchar(20));

INSERT INTO @Table1 VALUES('a'),('b'),('c'),('d'),('e');

DECLARE @Result varchar(max);

SELECT @Result = (SELECT CAST(Name AS varchar(20)) + ',' FROM @Table1 FOR XML PATH('')), @Result = SUBSTRING(@Result, 1, LEN(@Result) - 1);

SELECT @Result AS 字符串;

7.   根据起始和结束字符串,提取子字符串,代码如下:

1)   首先,创建一张临时表并写入数据

IF(OBJECT_ID('tempdb.dbo.#Table1', 'U') IS NOT NULL)

DROP TABLE #Table1;

CREATE TABLE #Table1(Id int, Value varchar(8000));

INSERT INTO #Table1 VALUES(1, '<id>1</id><name>爱变成</name><address>湖北</address>');

2)   检索位于起始字符与结束字符之间的字符串

DECLARE @start varchar(200) = '<name>', @end varchar(200) = '</name>';

SELECT SUBSTRING(Value, CHARINDEX(@start, Value) + LEN(@start), CHARINDEX(@end, Value) - (CHARINDEX(@start, Value) + LEN(@start))) AS Name, * FROM #Table1;

3)   执行结果

8.   查询某数据库的所有存储过程中,是否包含指定的字符串

--1. 申明变量

IF(OBJECT_ID('tempdb.dbo.#Temp_Proc', 'U') IS NOT NULL)

DROP TABLE #Temp_Proc;

GO

CREATE TABLE #Temp_Proc(ProcName varchar(100), SqlText text);

DECLARE @Temp1 TABLE(SqlText text);

DECLARE @ProcName varchar(100);

DECLARE cursor_proc CURSOR FOR SELECT name FROM sys.procedures;

--2. 使用游标遍历所有存储过程

OPEN cursor_proc;

FETCH NEXT FROM cursor_proc INTO @ProcName;

WHILE(@@FETCH_STATUS = 0)

BEGIN

--先写入表变量

DELETE @Temp1;  --注意:这里最好不要 DECLARE @Temp1 TABLE(SqlText text); 这样效率极低,原因不详!

INSERT INTO @Temp1 EXEC sp_helptext @ProcName;

--再写入临时表

INSERT INTO #Temp_Proc

SELECT @ProcName, SqlText FROM @Temp1;

FETCH NEXT FROM cursor_proc INTO @ProcName;

END

CLOSE cursor_proc;

DEALLOCATE cursor_proc;

--3. 查询临时表

DECLARE @PName varchar(100) = '', @PText varchar(200) = '%QueryText%';

SELECT * FROM #Temp_Proc WHERE 1=1

AND (LEN(@PName) = 0 OR ProcName = @PName)

AND SqlText LIKE @PText;

T-SQL 编程技巧的更多相关文章

  1. SQL 编程技巧

    Ø  简介 本文主要介绍编写 SQL 时的一些编程技巧,方便有时候忘了便于查看,主要包含以下内容: 1.   SQL 语句中使用 +=.-=.*=./= 运算符 2.   值为 NULL 的列或局部变 ...

  2. SQL Server 数据库编程技巧

    Ø  简介 本文主要介绍 SQL Server 数据库在平常的开发中,可能会涉及到的编程技巧,主要包含以下内容: 1.   解决 SQL Server 不支持 127.0.0.1 登录 2.   查询 ...

  3. SQL开发技巧(二)

    本系列文章旨在收集在开发过程中遇到的一些常用的SQL语句,然后整理归档,本系列文章基于SQLServer系列,且版本为SQLServer2005及以上-- 文章系列目录 SQL开发技巧(一) SQL开 ...

  4. EF – 2.EF数据查询基础(上)查询数据的实用编程技巧

    目录 5.4.1 查询符合条件的单条记录 EF使用SingleOrDefault()和Find()两个方法查询符合条件的单条记录. 5.4.2 Entity Framework中的内部数据缓存 DbS ...

  5. 自从学了SQL编程,哪里不会点哪里!!!

    在学习SQL编程前,先给大家分享几个段子吧,咱先乐呵乐呵! <桃花庵--程序员版> 写字楼里写字间,写字间中程序员:程序人员写程序,又将程序换酒钱: 酒醒只在屏前坐,酒醉还来屏下眠:酒醉酒 ...

  6. SQL开发技巧(二) 【转】感觉他写的很好

    本文转自: http://www.cnblogs.com/marvin/p/DevelopSQLSkill_2.html 本系列文章旨在收集在开发过程中遇到的一些常用的SQL语句,然后整理归档,本系列 ...

  7. EF – 2.EF数据查询基础(上)查询数据的实用编程技巧

    目录 5.4.1 查询符合条件的单条记录 EF使用SingleOrDefault()和Find()两个方法查询符合条件的单条记录. 5.4.2 Entity Framework中的内部数据缓存 DbS ...

  8. Delphi 与SQL编程

    Delphi 与SQL编程 SQL语言作为关系数据库管理系统中的一种通用的结构查询语言, 已经被众多的数据库管理系统所采用,如Oracle.Sybase.Informix等数据库管理系统,它们都支持S ...

  9. js异步编程技巧一

    异步回调是js的一大特性,理解好用好这个特性可以写出很高质量的代码.分享一些实际用的一些异步编程技巧. 1.我们有些应用环境是需要等待两个http请求或IO操作返回后进行后续逻辑的处理.而这种情况使用 ...

  10. sqL编程篇(三) 游标与存储过程

    sql编程2 游标与存储过程 sql编程中的游标的使用:提供的一种对查询的结果集进行逐行处理的一种方式不用游标的处理解决方式:逐行修改工资update salar set 工资=‘新工资’ where ...

随机推荐

  1. neutron相关知识

    Neutron 对虚拟三层网络的实现是通过其 L3 Agent (neutron-l3-agent).该 Agent 利用 Linux IP 栈.route 和 iptables 来实现内网内不同网络 ...

  2. VC++2010组件安装失败解决办法

    安装SQLSERVER时,安装不上,总是报错说 VC++2010组件安装错误. 单独安装时,也会报出严重错误无法安装.就是下面这两个 最后到网上找到一个办法解决了:如下: 下载这个软件 Microso ...

  3. NOIP2011Mayan游戏(模拟)

    Mayan puzzle是最近流行起来的一个游戏.游戏界面是一个77 行\times 5×5列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他方块之上.游戏通关是指 ...

  4. 【redis】redis配置文件参数解析

    redis配置文件路径可以通过info命令找到 Redis配置参数如下daemonize no 默认情况下,redis不是以守护进程的方式运行,一般生产环境,把该项的值更改为 yesrequirepa ...

  5. 利用LVS+Keepalived搭建Mysql双主复制高可用负载均衡环境

    应用背景: MySQL复制(主主,主从...)能在保证数据的备份的同时也能够做读写分离分摊系统压力,但是发生单点故障时,需要手动 切换到另外一台主机.LVS和Keppalived可以设定一个VIP来实 ...

  6. Learn to securely share files on the blockchain with IPFS!

    https://medium.com/@mycoralhealth/learn-to-securely-share-files-on-the-blockchain-with-ipfs-219ee47d ...

  7. ArcGIS for qml - 地址地标转换为经纬度(地理编码)

    实现输入地址地标转换为其经纬度 本文链接:地理编码 作者: 狐狸家的鱼 Github: 八至 一.地理编码 1.地理编码含义 地址编码(或地理编码)是使用地址中包含的信息来插入地图上的相应位置的过程. ...

  8. C# winfrom容器布局与工具栏&&右键菜单栏&&隐藏显示小图标的的简单事件

    前两天的时候学习了winfrom,简单地说就是各种布局,然后给按钮,textbox等各种控件添加各种事件的操作,经过前天一晚上,昨天一天的练习操作的还算熟练,但是对构造函数传值还是不是很了解,由于各种 ...

  9. zabbix3.4 监控网卡流量设置差量

    自定义监控项的时候 看里面预设的监控网卡下载流量的key是 net.if.in[if,<mode>]这次可以监控流量了 但是添加监控项的时候 看网上别人的 都是可以设置数值是每秒的差量 出 ...

  10. canvas简易画板

    代码展示: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...