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 字符串常量)
     
  • 相关阅读:
    Ubuntu 安装mono
    关于BigDecimal.ROUND_HALF_UP与ROUND_HALF_DOWN
    android 常用框架
    理解assign,copy,retain变strong
    SQLSERVER2008R2正确使用索引
    除非 Windows Activation Service (WAS)和万维网发布服务(W3SVC)均处于运行状态,否则无法启动网站。目前,这两项服务均处于停止状态。
    Android资源命名规范
    eclipse导入Android项目后,项目的名称变为了主Activity的名称
    日常运维管理技巧一(查看负载 W)
    Shell简介:1分钟理解什么是Shell 脚本语言 解释器 以及编译器和编译语言
  • 原文地址:https://www.cnblogs.com/xuezhi/p/3053180.html
Copyright © 2011-2022 走看看