下面是一个存储过程,但是我没见过这种写法, 百度过没有找要我要的答案。请求反导,另外能谁介绍一下如果要写存储过程有那些书可以推荐一下。sql server 2008 r2CREATE PROCEDURE [dbo].[UP_Manaual]
@loginName NVARCHAR(50),
@So BIGINT
WITH EXECUTE AS 'dbo'   ---不懂
AS
SET NOCOUNT ON;      --会产生那些影响,为什么做写这个
DECLARE @rowid INT,
        @point INT ,
        @customerID INT  
        ;              --AS前后的变量有什么不同,为什么要在这里定义这些变量
        
SELECT @CustomerID = CustomerID,@point=0 FROM [Customer].dbo.[Customer] WITH(NOLOCK) WHERE [LoginName]=@loginName;    
--
SELECT TOP 1 @point=ISNULL([Point],0)
 FROM YinTaiCustomer.dbo.CustomerPointHistory WITH(NOLOCK)
 WHERE [CustomerID]=@customerID AND [ReferenceNumber]=@So AND [Status]=0
--产生什么影响,写两个SQL有什么好处,表示我一直都是只写一个SQL
--[]这个为什么要加?不加有什么不同?IF @point=0
BEGIN
   SELECT '没有'+CONVERT(VARCHAR(20),@So)+'可用积分';
   RETURN 0;
END--记录原始记录日志
INSERT INTO.dbo.Manual_ProcessLog(UserName,procedureName,PARAMETER,HistoryData,timestr)
SELECT SYSTEM_USER AS N'Username',
OBJECT_NAME(@@PROCID) AS N'ProcedureName',
(SELECT @loginName AS N'LoginName',
        @So AS N'so'
      FOR XML PATH(''),TYPE   ---FOR这里表示什么意思。
 ) AS N'Parameter',
(SELECT [CustomerID],[RANK],[TotalPoint],ValidPoint
 FROM YinTaiCustomer.dbo.Customer WITH(NOLOCK)
 WHERE [LoginName]=@loginName
 FOR XML AUTO,TYPE
 ) AS N'HistoryDate',
 GETDATE() AS N'Timestr'
;
--上面表里面是5个参数,下面为什么要传六个。
SET @rowid=@@IDENTITY;
……
GO请教各位指导。

解决方案 »

  1.   

    CREATE PROCEDURE [dbo].[UP_Manaual]
    @loginName NVARCHAR(50),
    @So BIGINT
    WITH EXECUTE AS 'dbo'   ---不懂 指定该存储过程归谁所有http://msdn.microsoft.com/zh-cn/library/ms178106.aspx
    AS
    SET NOCOUNT ON;      --会产生那些影响,为什么做写这个/*当 SET NOCOUNT 为 ON 时,将不向客户端发送存储过程中每个语句的 DONE_IN_PROC 消息。如果存储过程中包含一些并不返回许多实际数据的语句,或者如果过程包含 Transact-SQL 循环,网络通信流量便会大量减少,因此,将 SET NOCOUNT 设置为 ON 可显著提高性能。
    */
    DECLARE @rowid INT,
            @point INT ,
            @customerID INT  
            ;              --AS前后的变量有什么不同,为什么要在这里定义这些变量
            /*as之前的变量是需要与外部进行声明使用的参数.而之后得就是局部使用可以在需要的地方再声明*/
    SELECT @CustomerID = CustomerID,@point=0 FROM [Customer].dbo.[Customer] WITH(NOLOCK) WHERE [LoginName]=@loginName;    
    --
    SELECT TOP 1 @point=ISNULL([Point],0)
     FROM YinTaiCustomer.dbo.CustomerPointHistory WITH(NOLOCK)
     WHERE [CustomerID]=@customerID AND [ReferenceNumber]=@So AND [Status]=0
    --产生什么影响,写两个SQL有什么好处,表示我一直都是只写一个SQL
    --[]这个为什么要加?不加有什么不同?/*[] 转义符的使用可以解决代码中可能存在的名称与保留字或者不支持字符的通用性*/IF @point=0
    BEGIN
       SELECT '没有'+CONVERT(VARCHAR(20),@So)+'可用积分';
       RETURN 0;
    END--记录原始记录日志
    INSERT INTO.dbo.Manual_ProcessLog(UserName,procedureName,PARAMETER,HistoryData,timestr)
    SELECT SYSTEM_USER AS N'Username',
    OBJECT_NAME(@@PROCID) AS N'ProcedureName',
    (SELECT @loginName AS N'LoginName',
            @So AS N'so'
          FOR XML PATH(''),TYPE   ---FOR这里表示什么意思。/*XML 查询语句语法要求,详细可查看
    http://msdn.microsoft.com/zh-cn/library/ms178107.aspx */
     ) AS N'Parameter',
    (SELECT [CustomerID],[RANK],[TotalPoint],ValidPoint
     FROM YinTaiCustomer.dbo.Customer WITH(NOLOCK)
     WHERE [LoginName]=@loginName
     FOR XML AUTO,TYPE
     ) AS N'HistoryDate',
     GETDATE() AS N'Timestr'
    ;
    --上面表里面是5个参数,下面为什么要传六个。
    /*Username,ProcedureName,Parameter,HistoryDate,Timestr 5个哦?*/SET @rowid=@@IDENTITY;
    ……
    GO
      

  2.   

    WITH EXECUTE AS 'dbo' 
    EXECUTE AS 默认限制为当前数据库通过指定执行模块的上下文,可以控制 SQL Server 2005 数据库引擎使用哪一个用户帐户来验证对模块引用的对象的权限。这有助于人们更灵活、有力地管理用户定义的模块及其所引用对象所形成的对象链中的权限。必须而且只需授予用户对模块自身的权限,而无需授予用户对被引用对象的显式权限。只有运行模块的用户必须对模块访问的对象拥有权限。
    SET NOCOUNT ON
    当 SET NOCOUNT 为 ON 时,不返回计数(表示受 Transact-SQL 语句影响的行数)。当 SET NOCOUNT 为 OFF 时,返回计数。如果存储过程中包含的一些语句并不返回许多实际的数据,则该设置由于大量减少了网络流量,因此可显著提高性能。 --AS前后的变量有什么不同,为什么要在这里定义这些变量as前面的是存储过程的参数,调用存储过程时要传入参数。
    as后面的是存储过程里面生命的变量,只是一个赋值取值的操作,先把值赋给变量,然后后面在把变量赋给里面。
    SELECT @CustomerID = CustomerID,@point=0 FROM [Customer].dbo.[Customer] WITH(NOLOCK) WHERE [LoginName]=@loginName;    
    --
    SELECT TOP 1 @point=ISNULL([Point],0)
     FROM YinTaiCustomer.dbo.CustomerPointHistory WITH(NOLOCK)
     WHERE [CustomerID]=@customerID AND [ReferenceNumber]=@So AND [Status]=0
    --产生什么影响,写两个SQL有什么好处,表示我一直都是只写一个SQL
    --[]这个为什么要加?不加有什么不同?第一条语句是取@CustomerID 的值,然后赋值到第二条语句的条件里
    []括号是让你更清楚的看清语句,[]可有可无,但是有时候为了区别有些系统自带的关键字,加上[]更容易识别
    FOR XML PATH(''),TYPE
    FOR XML 查询的结果始终直接以文本形式返回到客户端。从 SQL Server 2005 开始,SQL Server 就支持 xml 数据类型,这样便可以通过指定 TYPE 指令请求将 FOR XML 查询的结果作为 xml 数据类型返回。这样您便可以在服务器上处理 FOR XML 查询的结果。例如,可以对其指定 Xquery,将结果分配给 xml 类型变量,或编写嵌套 FOR XML 查询。@@IDENTITY;返回最后插入的标识值的系统函数。
      

  3.   

    当 SET NOCOUNT 为 ON 时,不返回计数(表示受 Transact-SQL 语句影响的行数)。当 SET NOCOUNT 为 OFF 时,返回计数。如果存储过程中包含的一些语句并不返回许多实际的数据,则该设置由于大量减少了网络流量,因此可显著提高性能。
      

  4.   

    我想说的和他差不多,就俩地方不同
    1.as前是外界传入存储过程的变量,as后是自己声明的变量
    2.2个SQL那里,是先给@CustomerID赋值以及@point初始化0,然后再用@CustomerID的值进行查询;其实前一个@point不赋值0也没有问题,主要是取@CustomerID,不过这两句可以合并为一句
      

  5.   

    sql 技术内幕 ……………………存储过程(feixianxxx)
    http://topic.csdn.net/u/20091127/21/10a70c07-8683-4f9e-be7e2415fa8f6956.htmlseed=296887941&r=61490884#r_61490884有关存储过程的讨论
    http://topic.csdn.net/u/20080511/21/ffe1bd32-fff2-4067-bcf9-cadea806ac8f.html?1953379669常用存储过程语法收藏  
    http://topic.csdn.net/u/20090216/10/fca7534f-e881-4e37-b9b7-8fe141ee186b.html?15784