如何在不修改SQL Server存储过程时对结果加WHERE条件?报错求解
问题原因
动态SQL(通过sp_executesql执行的语句)拥有独立的执行上下文,在其中声明的表变量@ResultatsTemp仅能在该动态SQL内部生效,主脚本的外部代码无法访问这个变量,这就是触发"必须声明表变量"错误的根源。
修正方案一:将所有逻辑整合到动态SQL中
把插入存储过程结果、过滤查询的操作全部放到动态SQL内部,让表变量在同一个执行上下文里完成所有流程:
DECLARE @Colonnes TABLE ( NomColonne NVARCHAR(100), DataType NVARCHAR(100) ) INSERT INTO @Colonnes (NomColonne, DataType) SELECT COLUMN_NAME, DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'T_RecapElementTechnique' DECLARE @query NVARCHAR(MAX) = ' DECLARE @ResultatsTemp TABLE (' SELECT @query = @query + QUOTENAME(NomColonne) + ' ' + DataType + ',' FROM @Colonnes SET @query = LEFT(@query, LEN(@query) - 1) + ') INSERT INTO @ResultatsTemp EXEC adcvie.ChargerRecapElementsTechniques 15 -- 过滤并返回结果 SELECT * FROM @ResultatsTemp WHERE EstVie=1' EXEC sp_executesql @query
修正方案二:使用本地临时表
如果需要在主脚本外部也能访问存储的结果,可以改用本地临时表(以#开头),临时表的作用域覆盖当前会话,动态SQL创建后外部代码也能直接访问:
DECLARE @Colonnes TABLE ( NomColonne NVARCHAR(100), DataType NVARCHAR(100) ) INSERT INTO @Colonnes (NomColonne, DataType) SELECT COLUMN_NAME, DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'T_RecapElementTechnique' DECLARE @query NVARCHAR(MAX) = ' CREATE TABLE #ResultatsTemp (' SELECT @query = @query + QUOTENAME(NomColonne) + ' ' + DataType + ',' FROM @Colonnes SET @query = LEFT(@query, LEN(@query) - 1) + ') INSERT INTO #ResultatsTemp EXEC adcvie.ChargerRecapElementsTechniques 15' EXEC sp_executesql @query -- 外部直接访问临时表并过滤 SELECT * FROM #ResultatsTemp WHERE EstVie=1 -- 可选:手动清理临时表,会话结束后系统也会自动删除 DROP TABLE #ResultatsTemp
内容的提问来源于stack exchange,提问作者nadal
相关产品推荐
相关产品推荐

