阿衡

不断追逐,永不放弃!

  博客园 :: 首页 :: 博问 :: 闪存 :: :: :: 订阅 订阅 :: 管理 ::
声明变量,SQL规定变量在使用之前先声明,以便以后的程序中用到
       格式:   declare 变量名 变量类型[,变量名 变量类型……]
一次可声明多个变量,它们之间用,分隔.用户变量以一个@开头,全局变量以@@开头.,因为时间关系我们在这里讲不到全局变量..下面我们声明几个变量.
Declare @score  int,@name  char(8)
给变量赋值;  格式:  SET 变量名=值
                    SET @SCORE=80
                    SET @NAME=’DUFEI’
 
或者是select 也可以给变量赋值:  select 变量名=值
 
显示变量;  格式: PRINT  变量名
declare  @score int,@NAME char(8)
set @score=80
set @name='dufei'
print cast(@score as char(8))+@name
  
常用的全局变量:
1.@@error 返回最后执行的T-SQL语句的错误代码,数据类型为整型。在SQL SERVER执行一个T-SQL语句之后,若成功,返回值为0,否则返回相应的错误代码。
也就是说如果你在一个程序想知道一个SQL语句是否有问题,是否被成功执行,可以通过@@ERROR来判断,是否为0即可!
 
2.@@CONNECTIONS
返回自上次启动 SQL Server以来连接或试图连接的次数。
语法
@@CONNECTIONS
返回类型
INT
注释
连接与用户不同。例如,应用程序可以打开多个与 SQL Server 的连接,而不需要用户监视这些连接。
若要显示一个包含几个 SQL Server 统计信息的报表,包括试图连接统计信息,请运行 sp_monitor。
例如,如果报告中 cpu_busy 显示为 4250(215)-68%,则自 SQL Server 上次启动以来,CPU 工作了 4250 秒;自上次运行 sp_monitor 以来,CPU 工作了 215 秒;自上次运行 sp_monitor 以来占总时间的 68%。
示例
下面的示例显示了到当前日期和时间为止试图登录的次数。
SELECT GETDATE() AS 'Today’s Date and Time',
   @@CONNECTIONS AS 'Login’S'
下面是结果集:
Today's Date and Time              Login’s
---------------------------        ---------------
1998-04-09 14:28:46.940            18
 
 
3. @@CPU_BUSY
返回自上次启动 Microsoft® SQL Server™ 以来 CPU 的工作时间,单位为毫秒(基于系统计时器的分辨率)。
语法
@@CPU_BUSY
返回类型
integer
示例
下面的示例显示了到当前日期和时间为止 SQL Server CPU 的活动。
SELECT @@CPU_BUSY AS 'CPU ms', GETDATE() AS 'As of'
下面是结果集:
CPU ms               As of
-----------------    ---------------------------
20                   1998-04-18  14:43:08.180
 
 
4. @@DATEFIRST
返回 SET DATEFIRST 参数的当前值,SET DATEFIRST 参数指明所规定的每周第一天:1 对应星期一,2 对应星期二,依次类推,用 7 对应星期日。
语法
@@DATEFIRST
返回类型
tinyint
注释
美国英语中默认 7 对应星期日。
示例
下面的示例将每周第一天设为 5 (星期五),并假定当日是星期六。SELECT 语句返回 DATEFIRST 值和当日是此周的第几天。
SET DATEFIRST 5
SELECT @@DATEFIRST AS '1st Day', DATEPART(dw, GETDATE()) AS 'Today'
下面是结果集。从星期五算起,今天(星期六)是第二天。
1st Day           Today
----------------  --------------
5                 2
那如果改用中国时间,求今天是一周中的第几天
只需将  set datefirst 1  即可!  然后  datepart(dw,getdate()) as ‘今天是第几天’
5. @@SERVERNAME
返回运行 Microsoft® SQL Server™ 的本地服务器名称。
语法
@@SERVERNAME
返回类型
nvarchar
 
6. @@VERSION
返回 Microsoft® SQL Server™ 当前安装的日期、版本和处理器类型。
语法
@@VERSION
返回类型
nvarchar
注释
@@VERSION 返回的信息与 xp_msver 存储过程返回的产品名、版本、平台和文件数据相似,但 xp_msver 存储过程提供更详细的信息。
示例
下面的示例返回当前安装的日期、版本和处理器类型。
SELECT @@VERSION 
 
注释:是程序代码中不执行的文本字符串(也称为注解),在SQL SERVER中可以使用两种类型的注释字符:一种是ANSI标准的注释符。“--”用于单行注解;另一种是”/*    */” 用于多行注解。
 

分支语句:
分别画出流程图
 

IF   条件
BEGIN
 语句体
END
 
declare  @score int
set @score=80
IF @SCORE>=60
BEGIN
   print '恭喜你考试通过了'
END
IF 条件
BEGIN
   语句体
END
ELSE
BEGIN
语句体
END
declare  @score int
set @score=80
IF @SCORE>=60
BEGIN
   print '恭喜你考试通过了'
END
ELSE
BEGIN
PRINT ‘哇噻,你要补考了!’
END
 
  
  
  
  
  
  
 
 
 
 
 
 
 
 
 
 
 
 
CASE表达式:
多分支语句:计算条件列表并返回多个可能结果表达式之一。
 
 
简单CASE语法:
CASE [变量或字段]
when 表达式1   THEN  结果表达式1
when 表达式2   THEN  结果表达式2
when 表达式3   THEN  结果表达式3
when 表达式i   THEN  结果表达式i
else  结果表达式
END
 
 
GOTO 语句
最早出现在BASIC语法中,跳转语句,它不属于基本程序结构.因为它会使用程序的可读性变差,如果在大型程序中,GOGO语句会使程序变的很复杂,使人不得头绪.所以在程序中尽量少用GOTO,或者是不用.
 
循环语句;
While 条件
Begin
     语句体
End
 
存储过程的优点:
(1)       可以实现模块化编程:
(2) 执行效率更高
(3)存储过程能够减少网络流量 
(4)可实现安全机制
 
 
在SQL SERVER中存储过程分为三大类:
系统存储过程:
 
扩展存储过程:XP_开头的。 
用户自定义存储过程:
 
格式:
create proc procedure_name [;number] [@parameter data_type] [varying=default] [output]
  
as SQL语句
  
procedure_name是存储过程名
;number 是可选的整数,用来对同名的过程分组,以便用一条DROP PROCEDURE语句即可将同组的过程一同删除。例如:名为ORDERS的应用程序使用权的过程可以命名为order:1  order:2等 .drop procedure order 将删除整个组。
@parameter是过程中的参数。在CREATE PROC语句中可以声明一个或多个参数。用户必须在执行过程时提供每个所声明值(实际参数)
DATA_TYPE是参数的数据类型。
 
例:在数据库ITET中创建一个存储过程,用于查询某员工所负责项目的平均项目标的。
一个输入参数,一个输出参数,一个返回值。
Biaodi表
编号   项目                标的
1          网络工程       100000.0000
2          网站建设       10000.0000
3          系统集成       30000.0000
1          弱电系统       400000.0000
 
Create proc avgbiaodi @name varchar(10),@biaodi int output
As
Declare @errorsave int
Set @errorsave=0
Select @biaodi=avg(项目标的) from biaodi  as b  join yuangong as y on y.编号=b.编号   where y.姓名=@name
 
创建一组存储过程:
 
create proc gr;1
as select  * from yuangong
go
create proc gr;2
as select * from biaodi
go
create proc gr;3
as select * from a
go
 
execute gr;3
 
------------------------------
------------------------------
打开SQL Server 2005的管理工具,选中需要创建存储过程的数据库,找到“可编程性”,展开后可以看到“存储过程”。右键点击它,选择“新建存储过程”,哗~~~,右侧的编辑窗口打开了,里面装着SQL Server创建存储过程的语句,要不说微软就是仗义呢,这些东西都给你写好了,省的咱再自己想(仗义是仗义,可是这仗义的不是地儿啊,这加速了忘记写存储过程的语句,唉~~)。
  将存储过程的名字,参数,操作语句写好后,点击语法分析,没有错误就直接“F5”运行就好了,hoho。存储过程创建完毕,好快啊。以下是一个基本的存储过程的代码:
  CREATE PROCEDURE Get_Data   
   (   
       @Dealer_ID VARCHAR(50)  
    )   
    AS   
       SELECT * FROM myData WHERE Dealer_ID = @Dealer_ID

  既然创建存储过程已经会了,那么修改还会难吗?显然不会。这里不得不再次表扬一下微软,修改存储过程也是相当的容易。首先,刷新当前数据库的存储过程列表,这时就能看到你刚创建的存储过程的名字了,右键点击它,选择修改,右侧又打开了一个编辑窗口,装着的就是修改存储过程的代码(如下)
  ALTER PROCEDURE [dbo].[Get_Data]   
   (   
       @Dealer_ID VARCHAR(50)  
    )   
    AS   
       SELECT * FROM myData WHERE Dealer_ID = @Dealer_ID

  简单的修改下吧,增加个日期条件,代码如下
    ALTER PROCEDURE [dbo].[Get_Data]   
   (   
       @Dealer_ID VARCHAR(50),
       @Period VARCHAR(20)
    )   
    AS   
       SELECT * FROM myData WHERE Dealer_ID = @Dealer_ID AND Period = @Period

  哦了,Ctrl+S,呀,怎么弹了个框出来,让我选择目录啊。噢,错了,我修改存储过程呢,Ctrl+S没用,得F5才行,麻利儿的按一下,成功执行,哈哈,修改存储过程也不过如此嘛。
  嘿,别得意,创建修改你都是靠SQL Server的工具来帮助你的,有本事你自己写一个。呃,这个,下回,下回的,我这就回去看存储过程的语句还不行嘛
唉,终于该开始数据操作了,累死我了。为什么非要写数据操作呢?其实写这个学习笔记之前是在使用存储过程操作数据的时候遇到了问题,为了记录这个问题,同时提醒自己要学习存储过程才写的这个笔记。言归正传,这个问题是什么呢?
  前面说了,我是在项目中遇到了使用存储过程的地方,所以才要写存储过程,开始写了一个存储过程,用来实现数据的插入操作,说白了就是添加数据。这个存储过程的代码如下:
  CREATE PROCEDURE PROC_INSERT_DATA_ID
        @DealerID varchar(50)
    AS
    BEGIN
        DECLARE @COUNT  INT   
       
        SET @COUNT = (SELECT COUNT(*) FROM myDATA_Details WHERE DealerID = @DealerID)
        IF (@COUNT>0)   
            BEGIN   
                DELETE FROM myDATA_Details WHERE DealerID = @DealerID   
                INSERT INTO myDATA_Details (DealerID) VALUES (@DealerID)   
            END   
        ELSE   
            BEGIN   
                INSERT INTO myDATA_Details (DealerID) VALUES (@DealerID)   
            END   
    END
  F5一下,创建成功,调用它插入数据,OK,没问题插入成功,达到了预期的目的。可是,我在建立第二个存储过程的时候,虽然将插入操作改为了更新,但是再像上面这么写就出错了,代码如下:
  CREATE PROCEDURE PROC_INSERT_DATA_DETAIL
        @DealerID varchar(50),
        @FieldName varchar(2000),
        @FieldValue varchar(2000)
    AS
    BEGIN
        DECLARE @Count INT
        SET @Count = (SELECT COUNT(*) FROM myDATA_Details WHERE DealerID = @DealerID)

        IF (@COUNT>0)
            BEGIN
                UPDATE myDATA_Details SET @FieldName = @FieldValue WHERE DealerID = @DealerID
            END
        ELSE
            BEGIN
                INSERT INTO myDATA_Details (DealerID) VALUES (@DealerID)
                UPDATE myDATA_Details SET @FieldName = @FieldValue WHERE DealerID = @DealerID
            END
    END
  语法OK,F5运行,也没有问题,兴奋啊,那就让它开始干活吧,咦,程序运行了呀,为什么没有更新呢,莫非是抛出异常了?赶紧,进Visual Studio 2005里Debug一下吧,走你,一路F11,没有问题啊,该调用的都调用了,也没有报错啊,那是怎么回事呢?存储过程?没道理吧!还是看看印度人是怎么写的吧,果然和我写的不一样,根据印度人的代码,对我建立的存储过程加以修改,修改完毕后再次运行程序,嗯,不错,这回终于是给我干活了。还是很有成就感的嘛,哈哈。
附:修改后的代码
  ALTER PROCEDURE PROC_INSERT_DATA_DETAIL
        @DealerID varchar(50),
        @FieldName varchar(2000),
        @FieldValue varchar(2000)
    AS
    BEGIN
        DECLARE @Count INT
        DECLARE @StrSQL VARCHAR(2000)
        SET @Count = (SELECT COUNT(*) FROM myDATA_Details WHERE DealerID = @DealerID)

        IF (@COUNT>0)
            BEGIN
                SET @StrSQL = 'UPDATE myDATA_Details SET '+ @FieldName + ' = ''' +@FieldValue + ''' WHERE DealerID = '+ @DealerID
                EXEC(@StrSQL)
            END
        ELSE
            BEGIN
                INSERT INTO myDATA_Details (DealerID) VALUES (@DealerID)
                SET @StrSQL = 'UPDATE myDATA_Details SET '+ @FieldName + ' = ''' +@FieldValue + ''' WHERE DealerID = '+ @DealerID
                EXEC(@StrSQL)
            END
    END
posted on 2010-08-27 08:59  阿衡  阅读(239)  评论(0编辑  收藏  举报