• 存储过程


    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 字符串常量)
     
  • 相关阅读:
    【手把手教你】win10 虚拟机 VMware Workstation Pro 15下安装Ubuntu 19.04
    虚拟机 VMware Workstation Pro 15.5.0 及永久激活密钥
    MATLAB 之MATLAB2016b 安装破解教程
    ubuntu 下 使用GTK+、sqlite3、c语言的学生系统
    drf 之序列化器-Serializer
    Element UI 中scope用法
    vue使用Element UI案例(商品列表)
    Django Rest_Framework(drf)介绍,以及安装和配置
    drf 准备知识(Web应用模式、 api接口、RESTful API规范和序列化)
    vue客户端项目的基本搭建以及ElementUI
  • 原文地址:https://www.cnblogs.com/xuezhi/p/3053180.html
Copyright © 2020-2023  润新知