存储过程中执行动态Sql语句
2017-03-22 11:32
537 查看
存储过程中执行动态Sql语句
MSSQL为我们提供了两种动态执行SQL语句的命令,分别是EXEC和sp_executesql;通常,sp_executesql则更具有优势,它提供了输入输出接口,而EXEC没有。还有一个最大的好处就是利用sp_executesql,能够重用执行计划,这就大大提供了执行性能,还可以编写更安全的代码。EXEC在某些情况下会更灵活。除非您有令人信服的理由使用EXEC,否侧尽量使用sp_executesql.1.EXEC的使用
EXEC命令有两种用法,一种是执行一个存储过程,另一种是执行一个动态的批处理。以下所讲的都是第二种用法。
下面先使用EXEC演示一个例子,代码1
按 Ctrl+C 复制代码
按 Ctrl+C 复制代码
注:这里的EXEC括号中只允许包含一个字符串变量,但是可以串联多个变量,如果我们这样写EXEC:
EXEC('SELECT TOP('+ CAST(@TopCount AS VARCHAR(10)) +')* FROM '+
QUOTENAME(@TableName) +' ORDER BY ORDERID DESC');
SQL编译器就会报错,编译不通过,而如果我们这样:
EXEC(@sql+@sql2+@sql3);
编译器就会通过;
所以最佳的做法是把代码构造到一个变量中,然后再把该变量作为EXEC命令的输入参数,这样就不会受限制了。
EXEC的缺点是不提供接口,这里的接口是指,它不能执行一个包含一个带变量符的批处理,如下
代码
DECLARE @TableName VARCHAR(50),@Sql NVARCHAR(MAX),@OrderID INT;
SET @TableName = 'Orders';
SET @OrderID = 10251;
SET @sql = 'SELECT * FROM '+QUOTENAME(@TableName) +
'WHERE OrderID = @OrderID ORDER BY ORDERID DESC'
EXEC(@sql);
代码
DECLARE @sql NVARCHAR(MAX),@RecordCount INT SET @sql = 'SELECT COUNT(ORDERID) FROM Orders'; CREATE TABLE #T(TID INT); INSERT INTO #T EXEC(@sql); SET @RecordCount = (SELECT TID FROM #T) SELECT @RecordCount DROP TABLE #T2
代码
DECLARE @TableName VARCHAR(50),@sql NVARCHAR(MAX),@OrderID INT ,@sql2 NVARCHAR(MAX); SET @TableName = 'Orders '; SET @OrderID = 10251; SET @sql = 'SELECT * FROM '+QUOTENAME(@TableName) + ' WHERE OrderID = '+CAST(@OrderID AS VARCHAR(50)) + ' ORDER BY ORDERID DESC' EXEC sp_executesql @sql
代码
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
代码
create PROCEDURE GetData @tbName nvarchar(10), @colName nvarchar(10), @Name nvarchar(10) AS BEGIN declare @sql nvarchar(50); set @sql='select '+ @colName+' from ' +@tbName+ ' where name=@whereName'; --注意此句不可以写成如下: -- set @sql='select @colName from @tbName where name=@whereName'; exec sp_executesql @sql, N'@whereName nvarchar(10)', @Name END
也就是说exec sp_executesql语句的参数声明部分只能声明动态sql的where子句的参数。
相关文章推荐
- 存储过程中执行动态Sql语句
- 在SQL存储过程内拼条件,动态生成SQL语句执行
- 存储过程中执行动态Sql语句
- 存储过程中执行动态Sql语句
- 转贴自微软MSDN:建议执行动态SQL时,使用sp_executesql 存储过程而不要使用EXECUTE 语句
- 存储过程中执行动态Sql语句
- 存储过程中执行动态Sql语句
- MySQL 存储过程中执行动态SQL语句的方法
- sqlserver 存储过程中拼接sql语句 动态执行
- MySql带参数的存储过程编写(动态执行SQL语句)
- MySql带参数的存储过程编写(动态执行SQL语句)
- mysql存储过程执行动态sql语句
- MySQL 存储过程中执行动态 SQL 语句
- 存储过程中执行动态Sql语句
- oracle存储过程中如何执行动态SQL语句
- 一个存储过程:带参数动态执行sql语句:Execute Immediate
- MySql带参数的存储过程编写(动态执行SQL语句)
- MySql带参数的存储过程编写(动态执行SQL语句)
- MySQL存储过程中实现执行动态SQL语句的方法
- 存储过程中执行动态Sql语句