zoukankan      html  css  js  c++  java
  • 存储过程

    MSSQL为我们提供了两种动态执行SQL语句的命令。分别是EXEC和sp_executesql.

    实例代码:

    DECLARE @TableName VARCHAR(50),@Sql NVARCHAR (MAX),@OrderID INT;
      SET @TableName
    ='Orders';
      SET @OrderID
    =10251;
      SET @sql
    =

         'SELECT * FROM '+QUOTENAME(@TableName) +'WHERE OrderID = '+
         CAST(@OrderID AS VARCHAR(10))+' ORDER BY ORDERID DESC'
      EXEC(@sql);
    EXEC括号中只允许包含一个字符串变量,但是可以串联多个变量。
    例如:1.EXEC('SELECT TOP('+ CAST(@TopCount AS VARCHAR(10)) +')* FROM '+
               QUOTENAME(@TableName) +' ORDER BY ORDERID DESC');
             编译报错。
            2. EXEC(@sql+@sql2+@sql3);
             编译通过。
    综上,最佳的做法是把代码构造到一个变量中,然后再把该变量作为EXEC命令的输入参数,这样就不会受限制了。
     EXEC除了不支持动态批处理中的输入参数外,他也不支持输出参数。
    sp_executesql的构成与存储过程非常相似,不同之处在于你是动态构建代码。它的构成包括:代码块,参数声明部分,参数赋值部分。
    具体语法如下:
     EXEC sp_executesql

       @stmt=<statement>,--类似存储过程主体

       @params
    =<params>, --类似存储过程参数部分,声明参数类型

      
    <params assignment>--类似存储过程调用,为参数赋值,参数值要和参数顺序要一一对应,也可以通过为参数指明参数值的方式为其赋值
    代码实例:
    DECLARE @TableName VARCHAR(50),@sql NVARCHAR(MAX),@OrderID INT;  
          SET @TableName
    ='Orders ';
          SET @OrderID
    =10251;  
          SET @sql
    ='SELECT * FROM '+@TableName +' WHERE OrderID = @OID ORDER BY ORDERID DESC' 
          --
    注意当要对动态sql语句的表名实行参数化时,不可以如下表示:
          --
    set @sql='select * from @TableName where OrderID=@OID ORDER BY Orderid desc',
         --
    如果这样会提示必须声明标量变量@TableName,只可以如上面所写的一样,将表名@TableName作为变量名进行拼接
          EXEC sp_executesql  
                  @sql,  
                 N
    '@OID int ',  
                @OID
    = @OrderID
     
     sq_executesql的另一个与其接口有关的强大功能是,你可以使用输出参数为调用批处理中的变量返回值。利用该功能可以避免用临时表返回数据,从而得到更高效的代码和更少的重新编译。定义和使用输出参数的语法与存储过程类似。也就是说,你需要在声明参数时指定OUTPUT子句。例如,下面的静态代码简单的演示了如何从动态批处理中利用输出参数@p把值返回到外部批处理中的变量@i.
    DECLARE @sql AS NVARCHAR(12),@i AS INT;
      SET @sql
    = N' SET @p = 10';
      EXEC sp_executesql
             @sql,
            N
    '@p AS INT OUTPUT',
            @p
    = @i OUTPUT
       SELECT @i  --
    该代码返回输出10
    (以字母 N 为前缀标识 Unicode 字符串常量)
     
  • 相关阅读:
    其实天很蓝,阴云终要散;其实海不宽,此岸连彼岸;其实泪也甜,当你心如愿。
    三大杀手,是不是杀到了你的内心深处呢?
    “天才就是1%的灵感加上99%的汗水”还有后半句
    oracle中的exists in 和not exists 用法详解
    toString()方法的作用
    oracle学习笔记——视图、索引(转载)
    serialVersionUID的作用
    pageEncoding和charset有什么区别
    equal(),hashcode(),toString()方法的作用
    库函数&linux下的系统调用 对比
  • 原文地址:https://www.cnblogs.com/xuezhi/p/3053180.html
Copyright © 2011-2022 走看看