这段T-SQL代码为何无法得到预期的记录计数结果?
T-SQL代码问题排查与修正
问题原因分析
- 变量初始化错误:
@fetchsql声明后未赋值,默认值为NULL。使用+=拼接字符串时,NULL与任何字符串拼接结果仍为NULL,导致exec(@fetchsql)实际执行空语句,无法对@rwcounting赋值,最终返回初始值0。 - 动态SQL参数传递失效:直接用
exec执行动态SQL时,内部上下文无法访问外部的@rwcounting变量,即便SQL语句正确,也无法将计数结果传递到外部变量。
修正后的代码
GO DECLARE @sch_names varchar(50), @table_names varchar(50), @rwcounting int SET @sch_names='HumanResources' SET @table_names ='Employee' SET @rwcounting = 0 DECLARE @fetchsql nvarchar(max) -- 初始化变量后再拼接SQL语句,同时用QUOTENAME避免SQL注入 SET @fetchsql = N'select @rwcounting = count(1) from '+QUOTENAME(@sch_names)+'.'+QUOTENAME(@table_names) -- 使用sp_executesql传递输出参数,实现内外变量的赋值传递 EXEC sp_executesql @fetchsql, N'@rwcounting int OUTPUT', @rwcounting OUTPUT SELECT @rwcounting
额外说明
使用QUOTENAME函数可以处理架构名或表名包含特殊字符的场景,同时避免SQL注入风险,提升代码安全性。
内容的提问来源于stack exchange,提问作者Sreekesh nath T.R
相关产品推荐
相关产品推荐

