1
我想运行以下存储过程。动态SQL错误
CREATE PROCEDURE NWR.GRADER
@YEAR AS NVARCHAR(4)
AS
BEGIN
DECLARE @sql1 as nvarchar(500) =
N'select a.*, b.pts as W_GRD_PTS
into nwr.atp_matches_' + @YEAR + N'WGP
from nwr.atp_matches_' + @YEAR + N' a
left join NWR.RNK_VAL as b on a.winner_rank >= low
and a.winner_rank<= high
alter table nwr.atp_matches_' + @YEAR + N'WGP
add L_GRD_PTS smallint null
UPDATE nwr.atp_matches_' + @YEAR + N'WGP
SET L_GRD_PTS = C.pts
FROM NWR.RNK_VAL C
WHERE loser_rank >= LOW AND loser_rank <= HIGH;'
--print (@sql1);
EXEC sys.sp_execute @sql1;
end;
exec nwr.GRADER @year='2016';
但是我发现了以下错误
消息214,级别16,状态2,过程sp_execute,行1个
过程需要类型 '诠释' 参数 '@Handle'。
但是当我切换到打印,而不是EXEC我得到正是我想象的那么下面的代码:
select a.*, b.pts as W_GRD_PTS
into nwr.atp_matches_2016WGP
from nwr.atp_matches_2016 a
left join NWR.RNK_VAL as b on a.winner_rank >= low and a.winner_rank <= high
alter table nwr.atp_matches_2016WGP
add L_GRD_PTS smallint null
UPDATE nwr.atp_matches_2016WGP
SET L_GRD_PTS=C.pts
FROM NWR.RNK_VAL C
WHERE loser_rank>= LOW AND loser_rank<= HIGH;
任何人都可以解释我做错了吗?
正是这种... EXEC sys.sp_execute @ sql1 ...应该是这样的... EXEC sys.sp_execute ** sql ** @ sql1; –
另外:在单个查询中混合使用DML(数据操作 - 选择,插入,删除)和DDL(数据定义 - 更改表等)的做法始终是一个坏主意。每次运行这个存储过程时,一个新列“L_GRD_PTS”将被添加到您的表中......实际上,这只会在一次**之后有效,然后失败......不要这样做!让你** DDL **与你的其他代码分开! –