T-SQL 编程技巧
Ø 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 编程技巧的更多相关文章
- SQL 编程技巧
Ø 简介 本文主要介绍编写 SQL 时的一些编程技巧,方便有时候忘了便于查看,主要包含以下内容: 1. SQL 语句中使用 +=.-=.*=./= 运算符 2. 值为 NULL 的列或局部变 ...
- SQL Server 数据库编程技巧
Ø 简介 本文主要介绍 SQL Server 数据库在平常的开发中,可能会涉及到的编程技巧,主要包含以下内容: 1. 解决 SQL Server 不支持 127.0.0.1 登录 2. 查询 ...
- SQL开发技巧(二)
本系列文章旨在收集在开发过程中遇到的一些常用的SQL语句,然后整理归档,本系列文章基于SQLServer系列,且版本为SQLServer2005及以上-- 文章系列目录 SQL开发技巧(一) SQL开 ...
- EF – 2.EF数据查询基础(上)查询数据的实用编程技巧
目录 5.4.1 查询符合条件的单条记录 EF使用SingleOrDefault()和Find()两个方法查询符合条件的单条记录. 5.4.2 Entity Framework中的内部数据缓存 DbS ...
- 自从学了SQL编程,哪里不会点哪里!!!
在学习SQL编程前,先给大家分享几个段子吧,咱先乐呵乐呵! <桃花庵--程序员版> 写字楼里写字间,写字间中程序员:程序人员写程序,又将程序换酒钱: 酒醒只在屏前坐,酒醉还来屏下眠:酒醉酒 ...
- SQL开发技巧(二) 【转】感觉他写的很好
本文转自: http://www.cnblogs.com/marvin/p/DevelopSQLSkill_2.html 本系列文章旨在收集在开发过程中遇到的一些常用的SQL语句,然后整理归档,本系列 ...
- EF – 2.EF数据查询基础(上)查询数据的实用编程技巧
目录 5.4.1 查询符合条件的单条记录 EF使用SingleOrDefault()和Find()两个方法查询符合条件的单条记录. 5.4.2 Entity Framework中的内部数据缓存 DbS ...
- Delphi 与SQL编程
Delphi 与SQL编程 SQL语言作为关系数据库管理系统中的一种通用的结构查询语言, 已经被众多的数据库管理系统所采用,如Oracle.Sybase.Informix等数据库管理系统,它们都支持S ...
- js异步编程技巧一
异步回调是js的一大特性,理解好用好这个特性可以写出很高质量的代码.分享一些实际用的一些异步编程技巧. 1.我们有些应用环境是需要等待两个http请求或IO操作返回后进行后续逻辑的处理.而这种情况使用 ...
- sqL编程篇(三) 游标与存储过程
sql编程2 游标与存储过程 sql编程中的游标的使用:提供的一种对查询的结果集进行逐行处理的一种方式不用游标的处理解决方式:逐行修改工资update salar set 工资=‘新工资’ where ...
随机推荐
- python 逻辑运算符问题
1 正确 if('A' not in self.storageDevice.softVersion or\ 'B' not in self.storageDevice.softVersion or\ ...
- 清理XFCE4卸载残留
apt-get remove xfce4 apt-get remove xfce4* apt-get autoremove apt-get autoclean apt-get clean --- 更新 ...
- JSOI2014骑士游戏(最短路)
题目背景 长期的宅男生活中,JYY又挖掘出了一款RPG游戏.在这个游戏中JYY会 扮演一个英勇的骑士,用他手中的长剑去杀死入侵村庄的怪兽. 题目描述 在这个游戏中,JYY一共有两种攻击方式,一种是普通 ...
- centos7下利用httpd2.4配置svn并使用Ldap用户认证
应用场景:Windows下有AD活动目录,类Unix系统下有Ldap,在运维开发工具平台逐步丰富的现在,统一用户管理大大便捷了管理人员. 其中不乏经典版本控制管理工具svn,与Ldap组合的用户认证方 ...
- 码农眼中的数学之~矩阵专栏(附Numpy讲解)
2.矩阵专栏¶ 吐槽一下:矩阵本身不难,但是矩阵的写作太蛋疼了 (⊙﹏⊙)汗 还好有Numpy,不然真的崩溃了... LaTex有没有一个集成了很多常用公式以及推导或者含题库的在线编辑器? 代码裤 ...
- C# Winfrom 进程&多线程
进程: 首先需要引用命名空间: using systemDiagnostics; 最简单的打开进程的方法,进程名并不是汉字: Process.start("calc");//cla ...
- 【模板】ac自动机
本来是真的特别不想写这个的 但是有段时间洛谷天天智推这个可能是我太菜了 然后觉得这个也不难 乘着今早没事写下 来这保存下 方便下次食用 #include <bits/stdc++.h> u ...
- 关于在 java 8 下开启 TLS_RSA_WITH_3DES_EDE_CBC_SHA 支持 xp ie8 tls1.0 的正常访问
最近为 aioserver 增加了ssl支持. 在 myssl.com 上测试了一下,关于[客户端握手模拟]发现 ie8 xp tls1.0 这一项提示:握手失败 (服务器断开连接) 我又试了一下 ...
- 第二篇-Django建立数据库各表之间的联系(中)
上篇中已经建立了两个table,Book和Publish.这篇介绍如何用python增删改查数据库中的数据. 在views.py中创建一个index函数 from django.shortcuts i ...
- plink: 等位型计数(allele count)
对genotype的等位型进行计数,需要用到以下参数: --freq Allele frequencies--counts Modifies --freq to report actual allel ...