存储过程

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 字符串常量)
 
原文地址:https://www.cnblogs.com/xuezhi/p/3053180.html