1.sql sever中的局部变量是怎么用的,我看过一些网友的回答,可能是比较笨吧,没有看懂,如果您看到这个题目的话麻烦您不厌其烦的详细的解释一下,这个变量到底是个什么意思。
2.符号 /*  */这个符号又是什么意思,什么时候用的? 
3.as 跟 begin有连用吗?什么时候用呢?
4.exec执行存储过程这个怎么用呢?比如我要执行get_total_report这个过程是
exec get_total_report
这样的吗?这个过程中有两个变量是没有赋值的,像 cashier_id 和 pos_id 
那要怎么执行呢?
是不是 exec get_total_report where cashier_id = '001' and pos_id='p001'这样呢?

解决方案 »

  1.   

    1.sql sever中的局部变量是怎么用的,我看过一些网友的回答,可能是比较笨吧,没有看懂,如果您看到这个题目的话麻烦您不厌其烦的详细的解释一下,这个变量到底是个什么意思。Transact-SQL 局部变量是可以保存特定类型的单个数据值的对象。批处理和脚本中的变量通常用于: 作为计数器计算循环执行的次数或控制循环执行的次数。
    保存数据值以供控制流语句测试。
    保存由存储过程返回代码返回的数据值。 
    下列脚本创建一个小的测试表并向其写入 26 行。脚本使用变量来执行下列三个操作: 通过控制循环执行的次数来控制插入的行数。
    提供插入整数列的值。
    作为表达式一部分生成插入字符列的字母。 
    -- Create the table.
    CREATE TABLE TestTable (cola INT, colb CHAR(3))
    GO
    SET NOCOUNT ON
    GO
    -- Declare the variable to be used.
    DECLARE @MyCounter INT-- Initialize the variable.
    SET @MyCounter = 0-- Test the variable to see if the loop is finished.
    WHILE (@MyCounter < 26)
    BEGIN
       -- Insert a row into the table.
       INSERT INTO TestTable VALUES
           -- Use the variable to provide the integer value
           -- for cola. Also use it to generate a unique letter
           -- for each row. Use the ASCII function to get the
           -- integer value of 'a'. Add @MyCounter. Use CHAR to
           -- convert the sum back to the character @MyCounter
           -- characters after 'a'.
           (@MyCounter,
            CHAR( ( @MyCounter + ASCII('a') ) )
           )
       -- Increment the variable to count this iteration
       -- of the loop.
       SET @MyCounter = @MyCounter + 1
    END
    GO
    SET NOCOUNT OFF
    GO声明 Transact-SQL 变量
    DECLARE 语句可以通过以下操作初始化 Transact-SQL 变量: 指派名称。名称的第一个字符必须为 @。
    指派系统提供或用户定义的数据类型和长度。对于数字变量还指定精度和小数位数。
    将值设置为 NULL。 
    说明  对局部变量使用系统提供的数据类型可尽可能减少将来的维护问题。 
    例如,下面的 DECLARE 语句使用 int 数据类型创建名称为 @mycounter 的局部变量。DECLARE @MyCounter INT若要声明多个局部变量,请在定义的第一个局部变量后使用一个逗号,然后指定下一个局部变量名称和数据类型。例如,下面的 DECLARE 语句创建三个局部变量,名称分别为 @last_name、@fname 和 @state,并将每个变量初始化为 NULL:DECLARE @LastName NVARCHAR(30), @FirstName NVARCHAR(20), @State NCHAR(2)变量的作用域为可以引用该变量的 Transact-SQL 语句范围。变量的作用域从声明变量的地方开始到声明变量的批处理或存储过程的结尾。例如,下面脚本产生语法错误,因为在一个批处理中所引用的变量是在另一个批处理中定义的:DECLARE MyVariable INT
    SET @MyVariable = 1
    GO -- This terminates the batch.
    -- @MyVariable has gone out of scope and no longer exists.-- This SELECT statement gets a syntax error because it is
    -- no longer legal to reference @MyVariable.
    SELECT *
    FROM Employees
    WHERE EmployeeID = @MyVariable设置 Transact-SQL 变量中的值
    第一次声明变量时将此变量的值设为 NULL。若要为变量赋值,请使用 SET 语句。这是为变量赋值的较好的方法。也可以通过 SELECT 语句的选择列表中当前所引用值为变量赋值。若要通过使用 SET 语句为变量赋值,请包含变量名和需要赋给变量的值。这是为变量赋值的较好的方法。例如,下面的批处理声明两个变量、对它们赋值并在 SELECT 语句的 WHERE 子句中予以使用:USE Northwind
    GO
    -- Declare two variables.
    DECLARE @FirstNameVariable NVARCHAR(20),
       @RegionVariable NVARCHAR(30)-- Set their values.
    SET @FirstNameVariable = N'Anne'
    SET @RegionVariable = N'WA'-- Use them in the WHERE clause of a SELECT statement.
    SELECT LastName, FirstName, Title
    FROM Employees
    WHERE FirstName = @FirstNameVariable
       OR Region = @RegionVariable
    GO变量也可以通过选择列表中当前所引用的值赋值。如果在选择列表中引用变量,则它应当被赋以标量值或者 SELECT 语句应仅返回一行。例如:USE Northwind
    GO
    DECLARE @EmpIDVariable INTSELECT @EmpIDVariable = MAX(EmployeeID)
    FROM Employees
    GO如果 SELECT 语句返回多行而且变量引用一个非标量表达式,则变量被设置为结果集最后一行中表达式的返回值。例如,在此批处理中将 @EmpIDVariable 设置为返回的最后一行的 EmployeeID 值,此值为 1:USE Northwind
    GO
    DECLARE @EmpIDVariable INTSELECT @EmpIDVariable = EmployeeID
    FROM Employees
    ORDER BY EmployeeID DESCSELECT @EmpIDVariable
    GO
      

  2.   

    2.符号 /* */这个符号又是什么意思,什么时候用的?  /*...*/(注释)
    表示用户提供的文本。服务器不对位于 /* 和 */ 注释字符之间的文本进行评估。语法
    / * text_of_comment * /参数
    text_of_comment包含注释文本的字符串。注释
    注释可以插入单独行中,或者 Transact-SQL 语句中。多行的注释必须用 /* 和 */ 指明。用于多行注释的样式规则是,第一行用 /* 开始,接下来的注释行用 ** 开始,并且用 */ 结束注释。 注释没有最大长度限制。说明  在注释中包含 GO 命令会生成一个错误信息。
    示例
    下面的示例使用注释来注明和测试在开发触发器的不同阶段期间的行为。在下面的示例中,将部分的触发器标为注释语句是为了缩小问题范围,并且只测试其中一个条件。使用了两种注释语句样式,SQL-92 样式的注释 (--) 分别以单独和嵌套的方式显示。 说明  下面 CREATE TRIGGER 语句失败的原因是命名为 employee_insupd 的触发器已经存在于 pubs 数据库中。
    CREATE TRIGGER employee_insupd
    /*
       Because CHECK constraints can only reference the column(s)
       on which the column- or table-level constraint has 
       been defined, any cross-table constraints (in this case, 
       business rules) need to be defined as triggers.   Employee job_lvls (on which salaries are based) should be within 
       the range defined for their job. To get the appropriate range, 
       the jobs table needs to be referenced. This trigger will be 
       invoked for INSERT and UPDATES only. 
    */
    ON employee
    FOR INSERT, UPDATE
    AS
    /* Get the range of level for this job type from the jobs table. */
    DECLARE @min_lvl tinyint,      -- Minimum level var. declaration
       @max_lvl tinyint,         -- Maximum level var. declaration
       @emp_lvl tinyint,         -- Employee level var. declaration
       @job_id smallint            -- Job ID var. declaration
    SELECT @min_lvl = min_lvl,      -- Set the minimum level
       @max_lvl = max_lvl,          -- Set the maximum level
       @emp_lvl = i.job_lvl,      -- Set the proposed employee level
       @job_id = i.job_id         -- Set the Job ID for comparison
    FROM employee e, jobs j, inserted i 
    WHERE e.emp_id = i.emp_id AND i.job_id = j.job_id
    IF (@job_id = 1) and (@emp_lvl <> 10) 
    BEGIN
       RAISERROR ('Job id 1 expects the default level of 10.', 16, 1)
       ROLLBACK TRANSACTION
    END
    /* Only want to test first condition. Remaining ELSE is commented out.
    -- Comments within this section are unaffected by this commenting style.
    ELSE
    IF NOT (@emp_lvl BETWEEN @min_lvl AND @max_lvl) -- Check valid range
    BEGIN
       RAISERROR ('The level for job_id:%d should be between %d and %d.',
          16, 1, @job_id, @min_lvl, @max_lvl)
       ROLLBACK TRANSACTION
    END
    */
    GO
    3.as 跟 begin有连用吗?什么时候用呢?
    创建存储过程(该过程有多条语句)等地方用的.
    create proc my_proc
    as
    begin
      第一条语句
      第二条语句
      ...
    end 
      

  3.   

    4.exec执行存储过程这个怎么用呢?比如我要执行get_total_report这个过程是
    exec get_total_report
    如果该get_total_report无参数,则可以这么用.否则参考:
    A. 使用带有复杂 SELECT 语句的简单过程
    下面的存储过程从四个表的联接中返回所有作者(提供了姓名)、出版的书籍以及出版社。该存储过程不使用任何参数。USE pubs
    IF EXISTS (SELECT name FROM sysobjects 
             WHERE name = 'au_info_all' AND type = 'P')
       DROP PROCEDURE au_info_all
    GO
    CREATE PROCEDURE au_info_all
    AS
    SELECT au_lname, au_fname, title, pub_name
       FROM authors a INNER JOIN titleauthor ta
          ON a.au_id = ta.au_id INNER JOIN titles t
          ON t.title_id = ta.title_id INNER JOIN publishers p
          ON t.pub_id = p.pub_id
    GOau_info_all 存储过程可以通过以下方法执行:EXECUTE au_info_all
    -- Or
    EXEC au_info_all如果该过程是批处理中的第一条语句,则可使用:au_info_allB. 使用带有参数的简单过程
    下面的存储过程从四个表的联接中只返回指定的作者(提供了姓名)、出版的书籍以及出版社。该存储过程接受与传递的参数精确匹配的值。USE pubs
    IF EXISTS (SELECT name FROM sysobjects 
             WHERE name = 'au_info' AND type = 'P')
       DROP PROCEDURE au_info
    GO
    USE pubs
    GO
    CREATE PROCEDURE au_info 
       @lastname varchar(40), 
       @firstname varchar(20) 
    AS 
    SELECT au_lname, au_fname, title, pub_name
       FROM authors a INNER JOIN titleauthor ta
          ON a.au_id = ta.au_id INNER JOIN titles t
          ON t.title_id = ta.title_id INNER JOIN publishers p
          ON t.pub_id = p.pub_id
       WHERE  au_fname = @firstname
          AND au_lname = @lastname
    GOau_info 存储过程可以通过以下方法执行:EXECUTE au_info 'Dull', 'Ann'
    -- Or
    EXECUTE au_info @lastname = 'Dull', @firstname = 'Ann'
    -- Or
    EXECUTE au_info @firstname = 'Ann', @lastname = 'Dull'
    -- Or
    EXEC au_info 'Dull', 'Ann'
    -- Or
    EXEC au_info @lastname = 'Dull', @firstname = 'Ann'
    -- Or
    EXEC au_info @firstname = 'Ann', @lastname = 'Dull'如果该过程是批处理中的第一条语句,则可使用:au_info 'Dull', 'Ann'
    -- Or
    au_info @lastname = 'Dull', @firstname = 'Ann'
    -- Or
    au_info @firstname = 'Ann', @lastname = 'Dull'C. 使用带有通配符参数的简单过程
    下面的存储过程从四个表的联接中只返回指定的作者(提供了姓名)、出版的书籍以及出版社。该存储过程对传递的参数进行模式匹配,如果没有提供参数,则使用预设的默认值。USE pubs
    IF EXISTS (SELECT name FROM sysobjects 
          WHERE name = 'au_info2' AND type = 'P')
       DROP PROCEDURE au_info2
    GO
    USE pubs
    GO
    CREATE PROCEDURE au_info2
       @lastname varchar(30) = 'D%',
       @firstname varchar(18) = '%'
    AS 
    SELECT au_lname, au_fname, title, pub_name
    FROM authors a INNER JOIN titleauthor ta
       ON a.au_id = ta.au_id INNER JOIN titles t
       ON t.title_id = ta.title_id INNER JOIN publishers p
       ON t.pub_id = p.pub_id
    WHERE au_fname LIKE @firstname
       AND au_lname LIKE @lastname
    GOau_info2 存储过程可以用多种组合执行。下面只列出了部分组合:EXECUTE au_info2
    -- Or
    EXECUTE au_info2 'Wh%'
    -- Or
    EXECUTE au_info2 @firstname = 'A%'
    -- Or
    EXECUTE au_info2 '[CK]ars[OE]n'
    -- Or
    EXECUTE au_info2 'Hunter', 'Sheryl'
    -- Or
    EXECUTE au_info2 'H%', 'S%'D. 使用 OUTPUT 参数
    OUTPUT 参数允许外部过程、批处理或多条 Transact-SQL 语句访问在过程执行期间设置的某个值。下面的示例创建一个存储过程 (titles_sum),并使用一个可选的输入参数和一个输出参数。首先,创建过程:USE pubs
    GO
    IF EXISTS(SELECT name FROM sysobjects
          WHERE name = 'titles_sum' AND type = 'P')
       DROP PROCEDURE titles_sum
    GO
    USE pubs
    GO
    CREATE PROCEDURE titles_sum @@TITLE varchar(40) = '%', @@SUM money OUTPUT
    AS
    SELECT 'Title Name' = title
    FROM titles 
    WHERE title LIKE @@TITLE 
    SELECT @@SUM = SUM(price)
    FROM titles
    WHERE title LIKE @@TITLE
    GO接下来,将该 OUTPUT 参数用于控制流语言。 说明  OUTPUT 变量必须在创建表和使用该变量时都进行定义。
    参数名和变量名不一定要匹配,不过数据类型和参数位置必须匹配(除非使用 @@SUM = variable 形式)。 DECLARE @@TOTALCOST money
    EXECUTE titles_sum 'The%', @@TOTALCOST OUTPUT
    IF @@TOTALCOST < 200 
    BEGIN
       PRINT ' '
       PRINT 'All of these titles can be purchased for less than $200.'
    END
    ELSE
       SELECT 'The total cost of these titles is $' 
             + RTRIM(CAST(@@TOTALCOST AS varchar(20)))下面是结果集:Title Name                                                               
    ------------------------------------------------------------------------ 
    The Busy Executive's Database Guide
    The Gourmet Microwave
    The Psychology of Computer Cooking(3 row(s) affected)Warning, null value eliminated from aggregate.
     
    All of these titles can be purchased for less than $200.E. 使用 OUTPUT 游标参数
    OUTPUT 游标参数用来将存储过程的局部游标传递回调用批处理、存储过程或触发器。首先,创建以下过程,在 titles 表上声明并打开一个游标:USE pubs
    IF EXISTS (SELECT name FROM sysobjects 
          WHERE name = 'titles_cursor' and type = 'P')
    DROP PROCEDURE titles_cursor
    GO
    CREATE PROCEDURE titles_cursor @titles_cursor CURSOR VARYING OUTPUT
    AS
    SET @titles_cursor = CURSOR
    FORWARD_ONLY STATIC FOR
    SELECT *
    FROM titlesOPEN @titles_cursor
    GO接下来,执行一个批处理,声明一个局部游标变量,执行上述过程以将游标赋值给局部变量,然后从该游标提取行。USE pubs
    GO
    DECLARE @MyCursor CURSOR
    EXEC titles_cursor @titles_cursor = @MyCursor OUTPUT
    WHILE (@@FETCH_STATUS = 0)
    BEGIN
       FETCH NEXT FROM @MyCursor
    END
    CLOSE @MyCursor
    DEALLOCATE @MyCursor
    GOF. 使用 WITH RECOMPILE 选项
    如果为过程提供的参数不是典型的参数,并且新的执行计划不应高速缓存或存储在内存中,WITH RECOMPILE 子句会很有帮助。USE pubs
    IF EXISTS (SELECT name FROM sysobjects
          WHERE name = 'titles_by_author' AND type = 'P')
       DROP PROCEDURE titles_by_author
    GO
    CREATE PROCEDURE titles_by_author @@LNAME_PATTERN varchar(30) = '%'
    WITH RECOMPILE
    AS
    SELECT RTRIM(au_fname) + ' ' + RTRIM(au_lname) AS 'Authors full name',
       title AS Title
    FROM authors a INNER JOIN titleauthor ta 
       ON a.au_id = ta.au_id INNER JOIN titles t
       ON ta.title_id = t.title_id
    WHERE au_lname LIKE @@LNAME_PATTERN
    GOG. 使用 WITH ENCRYPTION 选项
    WITH ENCRYPTION 子句对用户隐藏存储过程的文本。下例创建加密过程,使用 sp_helptext 系统存储过程获取关于加密过程的信息,然后尝试直接从 syscomments 表中获取关于该过程的信息。IF EXISTS (SELECT name FROM sysobjects
          WHERE name = 'encrypt_this' AND type = 'P')
       DROP PROCEDURE encrypt_this
    GO
    USE pubs
    GO
    CREATE PROCEDURE encrypt_this
    WITH ENCRYPTION
    AS
    SELECT * 
    FROM authors
    GOEXEC sp_helptext encrypt_this下面是结果集:The object's comments have been encrypted.接下来,选择加密存储过程内容的标识号和文本。SELECT c.id, c.text 
    FROM syscomments c INNER JOIN sysobjects o
       ON c.id = o.id
    WHERE o.name = 'encrypt_this'下面是结果集:说明  text 列的输出显示在单独一行中。执行时,该信息将与 id 列信息出现在同一行中。
    id         text                                                        
    ---------- ------------------------------------------------------------
    1413580074 ?????????????????????????????????e??????????????????????????????????????????????????????????????????????????(1 row(s) affected)H. 创建用户定义的系统存储过程
    下面的示例创建一个过程,显示表名以 emp 开头的所有表及其对应的索引。如果没有指定参数,该过程将返回表名以 sys 开头的所有表(及索引)。IF EXISTS (SELECT name FROM sysobjects
          WHERE name = 'sp_showindexes' AND type = 'P')
       DROP PROCEDURE sp_showindexes
    GO
    USE master
    GO
    CREATE PROCEDURE sp_showindexes
       @@TABLE varchar(30) = 'sys%'
    AS 
    SELECT o.name AS TABLE_NAME,
       i.name AS INDEX_NAME, 
       indid AS INDEX_ID
    FROM sysindexes i INNER JOIN sysobjects o
       ON o.id = i.id 
    WHERE o.name LIKE @@TABLE
    GO         
    USE pubs
    EXEC sp_showindexes 'emp%'
    GO下面是结果集:TABLE_NAME       INDEX_NAME       INDEX_ID 
    ---------------- ---------------- ----------------
    employee         employee_ind     1
    employee         PK_emp_id        2(2 row(s) affected)I. 使用延迟名称解析
    下面的示例显示四个过程以及延迟名称解析的各种可能使用方式。尽管引用的表或列在编译时不存在,但每个存储过程都可创建。IF EXISTS (SELECT name FROM sysobjects
          WHERE name = 'proc1' AND type = 'P')
       DROP PROCEDURE proc1
    GO
    -- Creating a procedure on a nonexistent table.
    USE pubs
    GO
    CREATE PROCEDURE proc1
    AS
       SELECT *
       FROM does_not_exist
    GO  
    -- Here is the statement to actually see the text of the procedure.
    SELECT o.id, c.text
    FROM sysobjects o INNER JOIN syscomments c 
       ON o.id = c.id
    WHERE o.type = 'P' AND o.name = 'proc1'
    GO
    USE master
    GO
    IF EXISTS (SELECT name FROM sysobjects
          WHERE name = 'proc2' AND type = 'P')
       DROP PROCEDURE proc2
    GO
    -- Creating a procedure that attempts to retrieve information from a
    -- nonexistent column in an existing table.
    USE pubs
    GO
    CREATE PROCEDURE proc2
    AS
       DECLARE @middle_init char(1)
       SET @middle_init = NULL
       SELECT au_id, middle_initial = @middle_init
       FROM authors
    GO  
    -- Here is the statement to actually see the text of the procedure.
    SELECT o.id, c.text
    FROM sysobjects o INNER JOIN syscomments c 
       ON o.id = c.id
    WHERE o.type = 'P' and o.name = 'proc2'这个过程中有两个变量是没有赋值的,像 cashier_id 和 pos_id  
    那要怎么执行呢?
    是不是 exec get_total_report where cashier_id = '001' and pos_id='p001'这样呢?-->exec get_total_report isnull(@cashier_id,'001') , isnull(@pos_id,'p001')
      

  4.   

    这些msdn里都有的吧直接看sql server的联机丛书很详细啊
      

  5.   

    额。as不是在取别名的时候用的么?这个过程里面有个变量
    ALTER  procedure dbo.get_cashtotal_report(@cashier_id char(4),@pos_id char(4))
    as
    declare @value table(
    value char(65) not null
    )
    是这个来的。是不是要在执行过程的时候将cashier_id 和 pos_id 的数值写出来呢?
      

  6.   

    在存储过程中,function
    as
    是表示正文的开始,exec get_total_report  '001','p001' --按照顺序exec get_total_report @cashier_id = '001',@pos_id='p001' --名字要与存储过程一样。