*****动态执行sql

來源:

http://www.cnblogs.com/MythYsJh/archive/2009/10/27/1590615.html

现实中会遇到需要拼接sql,并动态执行sql的情形:
DECLARE @StrSql NVARCHAR(MAX)
SET @StrSql = 'SELECT 1'
EXEC(@StrSql)--通过EXEC来执行动态拼接的sql,括号是必须的,否则后面的内容会被当做存储过程

     在动态拼接的sql里面完全可以像写一般的sql一样,但是有个问题是在动态sql里声明的变量只在动态sql里有效,在外面是不能访问的:

DECLARE @StrSql NVARCHAR(MAX)
SET @StrSql = 'DECLARE @COUNT INT'
SET @StrSql = @StrSql + ' SET @Count = 1
                          SELECT @Count
'
                          
EXEC(@StrSql)

这个语句会返回1,但是如果这样写:

DECLARE @StrSql NVARCHAR(MAX)
SET @StrSql = 'DECLARE @COUNT INT'
SET @StrSql = @StrSql + ' SET @Count = 1
                          
'
                          
EXEC(@StrSql)
SELECT @Count

就会出错了:Msg 137, Level 15, State 2, Line 7
                 必须声明标量变量 "@Count"。

 问题就来了,如果需要获取动态sql中的某些值怎么办?例如做了一个存储过程,动态拼的sql并且需要返回查询记录的总数,怎么办?

这时需要用到一个系统存储过程:sq_executesql

DECLARE @StrSql NVARCHAR(MAX)
DECLARE @Total INT
SET @StrSql = ' SET @TotalCount = 1'
                          
EXEC sp_executesql @StrSql,N'@TotalCount INT OUTPUT'@Total OUTPUT
SELECT @Total  --1

OK.

原文地址:https://www.cnblogs.com/luoyaoquan/p/2102875.html