SQL动态查询:如何根据参数生成对应数据表的查询语句?
动态SQL生成问题的解决方案
问题背景
数据库包含三个表:Table_1、Table_2、General_table,其中General_table的数据如下:
select * from General_table id Col1 1 34 2 35 9 34
现有一段动态SQL,期望根据参数@fil的值生成查询Table_1或Table_2的语句:
declare @fil nvarchar(max) = '34' declare @new_var nvarchar(max) set @new_var = 'select id from General_table where col1 =' + ''''+@fil+'''' print('select * from Table_'+@new_var+'')
当前执行后输出不符合预期,期望效果:
- 当
@fil='34'时,生成语句:select * from Table_1 - 当
@fil='35'时,生成语句:select * from Table_2
问题分析
原代码的核心问题是:将查询语句字符串直接拼接到了最终SQL中,而非先执行查询获取id的具体值。最终生成的是嵌套查询的错误语句(比如select * from Table_select id from General_table where col1 ='34'),而非预期的表名拼接格式。
另外注意:当Col1=34时General_table中有多个id(1和9),需明确查询逻辑确保取到预期的id=1。
修正后的代码
declare @fil nvarchar(max) = '34' declare @table_id int declare @dynamic_sql nvarchar(max) -- 先从General_table获取对应id,按需求取TOP 1确保拿到预期值 select TOP 1 @table_id = id from General_table where Col1 = @fil order by id -- 拼接生成正确的动态SQL set @dynamic_sql = 'select * from Table_' + CAST(@table_id as nvarchar(max)) -- 打印验证语句,如需执行可解开下方注释 print(@dynamic_sql) -- exec sp_executesql @dynamic_sql
代码说明
- 先用变量
@table_id存储从General_table查询到的具体id值,而非存储查询语句本身 - 通过
TOP 1和order by id确保当Col1对应多个id时,取到预期的id=1 - 将
@table_id转为字符串后与Table_拼接,生成符合要求的目标SQL语句
内容的提问来源于stack exchange,提问作者navee pp
相关产品推荐
相关产品推荐

