一、定义变量

--简单赋值
declare @a int
set @a=5
print @a
 
--使用select语句赋值
declare @user1 nvarchar(50)
select @user1='张三'
print @user1
declare @user2 nvarchar(50)
select @user2 = Name from ST_User where ID=1
print @user2
 
--使用update语句赋值
declare @user3 nvarchar(50)
update ST_User set @user3 = Name where ID=1
print @user3

 

二、表、临时表、表变量

--创建临时表1
create table #DU_User1
(
     [ID] [intNOT NULL,
     [Oid] [int] NOT NULL,
     [Login] [nvarchar](50) NOT NULL,
     [Rtx] [nvarchar](4) NOT NULL,
     [Name] [nvarchar](5) NOT NULL,
     [Password] [nvarchar](max) NULL,
     [State] [nvarchar](8) NOT NULL
);
--向临时表1插入一条记录
insert into #DU_User1 (ID,Oid,[Login],Rtx,Name,[Password],State) values (100,2,'LS','0000','临时','321','特殊');
 
--从ST_User查询数据,填充至新生成的临时表
select * into #DU_User2 from ST_User where ID<8
 
--查询并联合两临时表
select * from #DU_User2 where ID<3 union select * from #DU_User1
 
--删除两临时表
drop table #DU_User1
drop table #DU_User2
 
--创建临时表
CREATE TABLE #t
(
    [ID] [int] NOT NULL,
    [Oid] [int] NOT NULL,
    [Login] [nvarchar](50) NOT NULL,
    [Rtx] [nvarchar](4) NOT NULL,
    [Name] [nvarchar](5) NOT NULL,
    [Password] [nvarchar](max) NULL,
    [State] [nvarchar](8) NOT NULL,
)
 
--将查询结果集(多条数据)插入临时表
insert into #t select * from ST_User
--不能这样插入
--select * into #t from dbo.ST_User
 
--添加一列,为int型自增长子段
alter table #t add [myid] int NOT NULL IDENTITY(1,1)
--添加一列,默认填充全球唯一标识
alter table #t add [myid1] uniqueidentifier NOT NULL default(newid())
 
select * from #t
drop table #t
--给查询结果集增加自增长列
 
--无主键时:
select IDENTITY(int,1,1)as ID, Name,[Login],[Password] into #t from ST_User
select * from #t
 
--有主键时:
select (select SUM(1) from ST_User where ID<= a.ID) as myID,* from ST_User a order by myID
--定义表变量
declare @t table
(
    id int not null,
    msg nvarchar(50) null
)
insert into @t values(1,'1')
insert into @t values(2,'2')
select * from @t

 三、循环

--while循环计算1到100的和
declare @a int
declare @sum int
set @a=1
set @sum=0
while @a<=100
begin
    set @sum+=@a
    set @a+=1
end
print @sum

四、条件语句

--if,else条件分支
if(1+1=2)
begin
    print '对'
end
else
begin
    print '错'
end
 
--when then条件分支
declare @today int
declare @week nvarchar(3)
set @today=3
set @week=case
    when @today=1 then '星期一'
    when @today=2 then '星期二'
    when @today=3 then '星期三'
    when @today=4 then '星期四'
    when @today=5 then '星期五'
    when @today=6 then '星期六'
    when @today=7 then '星期日'
    else '值错误'
end
print @week

 

五、游标

declare @ID int
declare @Oid int
declare @Login varchar(50)
 
--定义一个游标
declare user_cur cursor for select ID,Oid,[Login] from ST_User
--打开游标
open user_cur
--读取游标
fetch next from user_cur into @ID,@Oid,@Login
while @@fetch_status=0
begin
    print @ID
    --print @Login
end
close user_cur
--摧毁游标
deallocate user_cur

六、触发器

  触发器中的临时表:

  Inserted 
  存放进行insert和update 操作后的数据 
  Deleted 
  存放进行delete 和update操作前的数据

--创建触发器
Create trigger User_OnUpdate
    On ST_User
    for Update
As
    declare @msg nvarchar(50)
    --@msg记录修改情况
    select @msg = N'姓名从“' + Deleted.Name + N'”修改为“' + Inserted.Name + '”' from Inserted,Deleted
    --插入日志表
    insert into [LOG](MSG)values(@msg)
     
--删除触发器
drop trigger User_OnUpdate

七、存储过程

--创建带output参数的存储过程
CREATE PROCEDURE PR_Sum
    @a int,
    @b int,
    @sum int output
AS
BEGIN
    set @sum=@a+@b
END
 
--创建Return返回值存储过程
CREATE PROCEDURE PR_Sum2
    @a int,
    @b int
AS
BEGIN
    Return @a+@b
END
     
--执行存储过程获取output型返回值
declare @mysum int
execute PR_Sum 1,2,@mysum output
print @mysum
 
--执行存储过程获取Return型返回值
declare @mysum2 int
execute @mysum2= PR_Sum2 1,2
print @mysum2
 

八、自定义函数

  函数的分类:

    1)标量值函数

    2)表值函数

        a:内联表值函数

        b:多语句表值函数

    3)系统函数

  

--新建标量值函数
create function FUNC_Sum1
(
    @a int,
    @b int
)
returns int
as
begin
    return @a+@b
end
 
--新建内联表值函数
create function FUNC_UserTab_1
(
    @myId int
)
returns table
as
return (select * from ST_User where ID<@myId)
 
--新建多语句表值函数
create function FUNC_UserTab_2
(
    @myId int
)
returns @t table
(
    [ID] [int] NOT NULL,
    [Oid] [int] NOT NULL,
    [Login] [nvarchar](50) NOT NULL,
    [Rtx] [nvarchar](4) NOT NULL,
    [Name] [nvarchar](5) NOT NULL,
    [Password] [nvarchar](max) NULL,
    [State] [nvarchar](8) NOT NULL
)
as
begin
    insert into @t select * from ST_User where ID<@myId
    return
end
 
--调用表值函数
select * from dbo.FUNC_UserTab_1(15)
--调用标量值函数
declare @s int
set @s=dbo.FUNC_Sum1(100,50)
print @s
 
--删除标量值函数
drop function FUNC_Sum1

 九、综合例子

  1. USE [DB_SJCT]
  2. GO
  3. /****** Object: StoredProcedure [dbo].[p_YearViewQuery] Script Date: 2015/6/4 9:45:08 ******/
  4. SET ANSI_NULLS ON
  5. GO
  6. SET QUOTED_IDENTIFIER ON
  7. GO
  8.  
  9. ALTER proc [dbo].[p_YearViewQuery]
  10. (
  11. @start datetime,
  12. @end datetime
  13. )
  14. as
  15. begin
  16.  
  17. declare @viewName varchar(50)
  18. declare @dateMax datetime
  19. declare @dateMin datetime
  20. declare @sql nvarchar(256)
  21. declare @point nvarchar(5)
  22.  
  23. set @point=char(39)
  24. --定义一个游标
  25. declare cur_viewSelect cursor for select viewName,dateMax,dateMin from T_yearSelect
  26. open cur_viewSelect
  27. fetch next from cur_viewSelect into @viewName,@dateMax,@dateMin
  28. while @@fetch_status=0
  29. begin
  30. --读取游标
  31. if @start >= @dateMin and @start <= @dateMax
  32. begin
  33. --单个视图中
  34. if @end>=@dateMin and @end <=@dateMax
  35. begin
  36. -- set @sql='select * from '+cast(@viewName as nvarchar)
  37. -- set @sql=@sql+' where rcy_rq >= '+@point+CONVERT(nvarchar(100), @start, 121)+@point
  38. -- set @sql=@sql+' and rcy_rq <= '+@point+CONVERT(nvarchar(100), @end, 121)+@point
  39. -- print @sql
  40. -- exec(@sql)
  41. set @sql='select * from '+cast(@viewName as nvarchar)
  42. set @sql=@sql+' where rcy_rq >= '''+CONVERT(nvarchar(100), @start, 121)+''''
  43. set @sql=@sql+' and rcy_rq <= '''+CONVERT(nvarchar(100), @end, 121)+ ''''
  44. print @sql
  45. exec(@sql)
  46. end
  47. --单个视图中
  48. else
  49. --两个视图中
  50. begin
  51. --前半部分
  52. set @sql='select * from '+cast(@viewName as nvarchar)
  53. set @sql=@sql+' where rcy_rq >= '+@point+CONVERT(varchar(100), @start, 121)
  54. set @sql=@sql+@point+' and rcy_rq <= '+@point+CONVERT(varchar(100), @dateMax, 121)+@point
  55. print @sql
  56. exec(@sql)
  57.  
  58. fetch next from cur_viewSelect into @viewName,@dateMax,@dateMin
  59. ME:PRINT('循环');
  60.  
  61. if @datemin-@end>0 or @@fetch_status=-1
  62. begin
  63. GOTO QUIT;--跳到结束
  64. end
  65. --后半部分
  66. if @end>=@dateMin and @end <=@dateMax
  67. begin
  68. set @sql='select * from '+cast(@viewName as nvarchar)
  69. set @sql=@sql+' where rcy_rq >= '+@point+CONVERT(varchar(100), @dateMin, 121)+@point
  70. set @sql=@sql+' and rcy_rq <= '+@point+CONVERT(varchar(100), @end, 121)+@point
  71. print @sql
  72. exec(@sql)
  73. end
  74. --后半部分
  75.  
  76. --中间部分
  77. else if @dateMin<@end
  78. begin
  79. set @sql='select * from '+cast(@viewName as nvarchar)
  80. print @sql
  81. exec(@sql)
  82. end
  83. --中间部分
  84. else
  85. begin
  86. print'后半部分最后else'
  87. end
  88. --中间部分
  89.  
  90. fetch next from cur_viewSelect into @viewName,@dateMax,@dateMin
  91. GOTO ME;--跳到循环
  92. --两个视图中
  93. end
  94. end
  95. fetch next from cur_viewSelect into @viewName,@dateMax,@dateMin
  96. end
  97. QUIT:PRINT('结束了');
  98. close cur_viewSelect
  99. deallocate cur_viewSelect
  100. end

谈谈自定义函数与存储过程的区别:

一、自定义函数:

  1. 可以返回表变量

  2. 限制颇多,包括

    不能使用output参数;

    不能用临时表;

    函数内部的操作不能影响到外部环境;

    不能通过select返回结果集;

    不能update,delete,数据库表;

  3. 必须return 一个标量值或表变量

  自定义函数一般用在复用度高,功能简单单一,争对性强的地方。

二、存储过程

  1. 不能返回表变量

  2. 限制少,可以执行对数据库表的操作,可以返回数据集

  3. 可以return一个标量值,也可以省略return

   存储过程一般用在实现复杂的功能,数据操纵方面。

sql(SqlServer)编程基本语法的更多相关文章

  1. sqlserver编程基本语法

    一.定义变量 --简单赋值 declare @a int set @a=5 print @a   --使用select语句赋值 declare @user1 nvarchar(50) select @ ...

  2. 转载:SQL Server编程基本语法

    一.定义变量 --简单赋值 declare @a int print @a --使用select语句赋值 ) select @user1='张三' print @user1 ) print @user ...

  3. SQLServer数据库查询语法

    SQLServer数据库查询语法 前言: SQLServer数据库介绍: SQLServer数据库是微软公司推出的一款关系型数据库系统,SQL Server是一个可扩展的.高性能的.为分布式客户机/服 ...

  4. PL/SQL存储过程编程

    PL/SQL存储过程编程 /**author huangchaobiao *Email:huangchaobiao111@163.com */ PL/SQL存储过程编程(上) 1. Oracle应用编 ...

  5. Oracle中PL/SQL简介、基本语法以及数据类型

    Oracle中PL/SQL简介.基本语法以及数据类型 一.PL/SQL简介. Oracle PL/SQL语言(Procedural Language/SQL)是结合了结构化查询和Oracle自身过程控 ...

  6. Oracle与SQL SERVER编程差异分析(入门)

    网上有关Oracle与SQL SERVER性能差异的文章很多,结论往往是让你根据数据量与预算来选择数据库.但实际项目中,特别是使用 .Net 开发的系统,支持以上两种数据库或者更多已经成为Boss的普 ...

  7. SQL Server编程系列(2):SMO常用对象的有关操作

    原文:SQL Server编程系列(2):SMO常用对象的有关操作 在上一篇周公简单讲述了SMO的一些基本概念,实际上SMO体系结构远不止周公在上一篇中讲述的那么简单,下图是MSDN上给出的一个完整的 ...

  8. SQL Server编程系列(1):SMO介绍

    原文:SQL Server编程系列(1):SMO介绍 续篇:SQL Server编程系列(2):SMO常用对象的有关操作 最近在项目中用到了有关SQL Server管理任务方面的编程实现,有了一些自己 ...

  9. Oracle SQL高级编程——分析函数(窗口函数)全面讲解

    Oracle SQL高级编程--分析函数(窗口函数)全面讲解 注:本文来源于:<Oracle SQL高级编程--分析函数(窗口函数)全面讲解> 概述 分析函数是以一定的方法在一个与当前行相 ...

随机推荐

  1. C\C++代码优化的27个建议

    1. 记住阿姆达尔定律: funccost是函数func运行时间百分比,funcspeedup是你优化函数的运行的系数. 所以,如果你优化了函数TriangleIntersect执行40%的运行时间, ...

  2. Java 下实现锁无关数据结构--转载

    介绍 通常在一个多线程环境下,我们需要共享某些数据,但为了避免竞争条件引致数据出现不一致的情况,某些代码段需要变成原子操作去执行.这时,我们便需要利用各种同步机制如互斥(Mutex)去为这些代码段加锁 ...

  3. [转] Linux文件系统之hard link&symbol link

    这个图很清楚的表示出硬链接和软链接的方式. 1.硬链接: 基本定义:硬链接是有着相同inode号的仅文件名不同的文件(该文件名包含路径信息). 理解:如图,hard link和原始file通过同一个i ...

  4. Html----常见标签

    文本格式化标签 标签 描述 <b> 定义粗体文本. <big> 定义大号字. <em> 定义着重文字. <i> 定义斜体字. <small> ...

  5. Java 图片与byte数组互相转换

    //图片到byte数组 public byte[] image2byte(String path){ byte[] data = null; FileImageInputStream input = ...

  6. android requestWindowFeature使用详解

    requestWindowFeature可以设置的值有:          1.DEFAULT_FEATURES:系统默认状态,一般不需要指定          2.FEATURE_CONTEXT_M ...

  7. 9.14noip模拟试题

    中文题目名称 祖孙询问 比赛 数字 英文题目名称 tree mat num 可执行文件名 tree mat num 输入文件名 tree.in mat.in num.in 输出文件名 tree.out ...

  8. Word查找和替换通配符(完全版)

    Word查找栏代码·通配符一览表 序号 清除使用通配符复选框 勾选使用通配符复选框 特殊字符 代码 特殊字符 代码or通配符 1 任意单个字符 ^? 任意单个字符 ? 2 任意数字 ^# 任意数字(单 ...

  9. HTML5 History对象,Javascript修改地址栏而不刷新页面

    一.History对象 History 对象包含用户(在浏览器窗口中)访问过的 URL. History 对象是 window 对象的一部分,可通过 window.history 属性对其进行访问. ...

  10. [转帖]了解AmbiLight知识

    了解科技前沿的方法..American Online=AOL.algorithm算法.(Denzel say, and I don't know) Engadget瘾科技网站.英文版Engadget网 ...