日期:2014-05-16  浏览次数:20568 次

EXECUTE sp_executesql和EXEC的区别
目的想实现某列内容置0.
于是我尝试了2种方法.
DECLARE @Sql NVARCHAR(200);
DECLARE @parm varchar(4);
set @parm = 'abc';

---下面这个能成功!----
SET @Sql = 'UPDATE tableA SET '+@parm+'=0 where biaozhi=111111';
EXEC(@sql);

--下面这个虽然没出错,但是实际没有更新为0
SET @Sql = N'UPDATE tableA  SET @parm=0 where biaozhi=111111';
EXECUTE  sp_executesql @Sql, N'@parm varchar(4)',@parm;


想请教下,我写的EXECUTE  sp_executesql 的写法错在哪里了?
------解决方案--------------------
DECLARE @Sql NVARCHAR(200);
DECLARE @parm nvarchar(10);
set @parm =N 'abc';
 
--下面这个虽然没出错,但是实际没有更新为0
SET @Sql = N'UPDATE tableA  SET @parm=0 where biaozhi=111111';
EXECUTE  sp_executesql @Sql, N'@parm nvarchar(10)',@parm;
这个呢?
------解决方案--------------------
第二種方式@parm傳入的是一個參數,當你update的時候是將@parm更新為0了,而不是@parm的值多對應的欄位
------解决方案--------------------
也就是說第二種方式執行的語句是固定的,變量依舊是變量,語句不會改變,變的只是變量的值, 而第一種方式是重組了SQL語句,語句有變化
------解决方案--------------------
第二句不是动态SQL。。。。。你更新的是变更不是列名
------解决方案--------------------
变更=变量
就你这个语句来说,SP_EXECUTESQL和EXEC的写法是一样的。它们的不同处在于SP_EXECUTESQL支持输出参数EXEC不支持,其它用法没区别。
------解决方案--------------------
--下面这个虽然没出错,但是实际没有更新为0
SET @Sql = N'UPDATE tableA  SET '+@parm + ' =0 where biaozhi=111111';
EXECUTE  sp_executesql @Sql