
别名表和列也可以
在开发过程中,我经常遇到我开始给某个字段命名为field1的情况,但是后来我感觉到field1字段未完全指定,因此我将该字段更改为field2. 使用字符串field1,该程序对field1进行了大量处理,这时您可以将其用作
例如,将表A中的原始选择字段1更改为从表A中选择字段2作为字段1
代码基本上是固定的.
2插入自增字段
在开发过程中,我经常遇到一种IDENTITY字段类型,它是一种自增长类型,但是由于特殊需要,我必须插入数据
需要暂时将其删除,可以使用以下语句将IDENTITY_INSERT表名设置为开,处理完成后,使用以下语句将IDENTITY_INSERT表名的设置恢复为关闭
3组以获取每组的前N个数据
在开发过程中,您还需要先对一组数据进行分组,然后对每组进行前n条记录
不妨尝试以下代码
/ *
按CurrentNodeLevel列分组,每个组按NodeID排序,并取出每个组中的前3个元素
* /
声明@temp表(NodeID int,CurrentNodeLevel int,rowNumber int)-定义临时表
插入@temp
选择NodeID,CurrentNodeLevel,ROW_NUMBER()
OVER(按CurrentNodeLevel分区
按NodeID排序)为rowNumber
来自SchoolTerminalStruct ---将数据插入临时表
从@temp中选择*,其中rowNumber <= 3-从临时表中获取数据
4生成随机数
希望此方法只能作为存储过程而不是函数编写
-----返回Max,Min之间的随机数不能写为函数
创建proc [dbo]. [getRAND]
(
@最大整数,最大值
@最小整数,-最小值
)
AS
开始
DECLARE @result int
SELECT @结果= RAND()*(@最大值-@最小值)+ @最小值
END
5用逗号分隔满足某些条件的数据
这也可能是一个很常见的句子,通常以一对多的关系出现并在外部显示,要求将子表中的数据取出并用逗号或其他符号分隔
/ *

用逗号组合满足t2.NodeID = t1.NodeID的tableA的字段NodeName,并将其合并到字段输出中
* /
选择*,东西((选择,+ t1. 来自tableA t1,tableB t2的节点名称
其中t2.NodeID = t1.NodeID
对于xml路径()),1、1)为文本
来自表A
6处理中间的异常
参数在输出参数后附加输出标志,并通过TRY和CATCH捕获异常
创建过程[dbo]. [sp_UpdateFunctionTree]
@nodename int,
@Result int输出--- 2,操作失败; 0操作成功
AS
开始
开始
开始尝试
更新FunctionTree设置
设置@结果= 0-操作成功
结束尝试
开始观看
设置@结果= -2-操作失败
结束观看
结束
END
查询中的7个条件判断
经常遇到在某些情况下应查询此字段,而在其他情况下则需要其他字段的情况. 可以通过unoin完成,但是也可以通过CASE WHEN
完成
/ *
当State = 0时返回field1,当State = 1时返回field2,否则返回field3;
* /
SELECT(在State = 0 THEN field1时,当State = 1 THEN field2时的情况
ELSE字段3 END)作为状态
FROM表名
处理8个单引号
包含单引号时应转义两个单引号
dbo.sp_executesql @statement = N选择indexID,性别=(当Sex = 0时为公,否则为母)
来自表名

9使用光标
声明@temp表(TaskID int,NodeId int)-声明临时表
插入@temp中,从表A A,表B B中选择A.TaskID,A.NodeId
其中A.TaskID = B.TaskID-//-将记录插入已声明的临时表中
DECLARE tnames_cursor CURSOR LOCAL FORWARD_ONLY READ_ONLY-声明光标
从@temp中选择TaskID,NodeId;-光标需要使用的列
打开tnames_cursor-打开游标
DECLARE @TaskID int,@ NodeId int;-声明变量
从tnames_cursor INTO @ TaskID,@ NodeId中移至下一个-移动光标以为变量分配一个值常见语句,该值应对应于光标需要使用的列.
在(@@ FETCH_STATUS = 0)循环时
开始
开始
exec TaskType @ TaskID,@ NodeId-调用存储过程
END
从tnames_cursor INTO @任务ID,@ NodeId,@ TaskRunCYCType中移出下一个-移动光标以为变量分配值应对应于光标需要使用的列,序列类型应一致
END
CLOSE tnames_cursor-关闭光标
DEALLOCATE tnames_cursor-释放光标
10个合并更新并插入
在开发中的大多数情况下,insert和update传递的参数基本相同,所以为什么不合并它们
创建proc [dbo]. [Save_TableName]
(
@ field1 varchar(50),
@ field2 varchar(200),
@ID int,
@insertOrUpdate-小于0的插入大于0的更新
)
为
开始
如果(@insertOrUpdate <0)
开始
INSERT INTO TableName(字段1,字段2,ID)
值(@ field1,@ field2,@ ID);
结束
其他
开始

UPDATE TableName SET field1 = @ field1,field2 = @ field2
其中的ID;
结束
结束
11定义功能
当不满足要求时,可以定义功能,但是在使用定义的功能时需要添加架构名称
创建功能[dbo]. [CheckTime]
(
@startTime日期时间,
@endTime datetime-,
)
RETURNS int
AS
开始
DECLARE @result int
SET @ result = DATEDIFF(小时,@ startTime,@ endTime)-
如果(@ result = 0)小时相同,则比较分钟数
开始
SET @ result = DATEDIFF(分钟,@ startTime,@ endTime)
如果(@ result = 0)分钟与秒相比是相同的
开始
SET @ result = DATEDIFF(秒,@ startTime,@ endTime)
结束
结束
返回@结果
END
调用此功能
dbo.CheckTime(@ startTime1,@ startTime2)-需要添加架构名称
12个递归读取数据
在实际应用中,我们经常会遇到树状表,但是阅读起来会更加麻烦. 这里有足够的功能要提及
/ *
函数返回一个表,返回给定节点的所有后代,而不仅仅是子代
* /
创建功能[dbo]. [GetChildren](@ NodeID Int)
返回@Tree表(NodeID整数常见语句,NodeName Varchar(50),ParentID整数)
为

开始
从Treetable中插入@Tree选择NodeID,NodeName,ParentID,其中ParentID = @NodeID
@@行数> 0
插入@Tree选择A.NodeID,A.NodeName和A.ParentID
从树表A
内部加入@Tree B
在A.ParentID = B.NodeID和A.NodeID不在的情况下(从@Tree中选择NodeID)
返回
结束
13默认情况下重载存储过程
可以将默认值用于存储过程,估计该值是已知的,但这可以实现类似的函数重载的效果
例如,由于以下存储过程使用默认值,因此您可以传递一个参数,两个,三个不带参数的
创建过程dbo.my_proc
@first int = NULL,-NULL默认值
@second int = 2,默认值为2
@third int = 3-默认值3
按SELECT @ first,@ second,@ third;
中有14个拼写字符串,您也可以使用参数
在实际开发中,在某些情况下不可避免地需要在中拼写字符串,但是我担心某些特殊字符会导致拼写SQL出现问题. 实际上,您还可以使用中的参数来拼写字符串. 使用dbo.sp_executesql可以避免由SQL注入和特殊字符引起的错误
如果
DECLARE @IntVariable INT;-定义变量
DECLARE @SQLString NVARCHAR(500);-存储拼写出的SQL
DECLARE @ParmDefinition NVARCHAR(500); ---将参数存储在详细的SQL中
/ *一次构建SQL字符串. * /
SET @SQLString =
NSELECT *来自AdventureWorks.Sales.Store WHERE SalesPersonID = @SalesID;
/ *一次指定参数格式. * /
SET @ParmDefinition = int;-分配
/ *使用第一个参数值执行字符串. * /
SET @IntVariable = 275;-分配
执行dbo.sp_executesql @ SQLString,@ ParmDefinition,
@SalesID = @IntVariable;
/ *使用第二个参数值执行相同的字符串. * /
SET @IntVariable = 276;
执行dbo.sp_executesql @ SQLString,@ ParmDefinition,
@SalesID = @IntVariable;
16个需要注意的触发问题
使用触发器时出现问题. 也许很少有人注意到,当一条更新语句一次更新十条记录时,会触发多少个触发器?只有一次! !这很奇怪,但这是事实,因此请务必注意,如果不注意,大量数据将被泄漏
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/tongxinshuyu/article-164104-1.html
一包粉里面有六条蛆
别人会给你加息么