使用动态SQL语句动态sql语句基本语法 
------------------------------------------------------------------------------------------------------------
1、:普通SQL语句可以用Exec执行 
eg:
Select * from tableName 
Exec('select * from tableName') 
Exec sp_executesql N'select * from tableName' -- 请注意字符串前一定要加N
2、字段名,表名,数据库名之类作为变量时,必须用动态SQL 
eg:
declare @fname varchar(20) 
set @fname = 'FiledName' 
Select @fname from tableName -- 错误,不会提示错误,但结果为固定值FiledName,并非所要。 
Exec('select ' + @fname + ' from tableName') -- 请注意,加号前后的单引号的边上加空格 --当然将字符串改成变量的形式也可 
declare @fname varchar(20) 
set @fname = 'FiledName' --设置字段名 declare @s varchar(1000) 
set @s = 'select ' + @fname + ' from tableName' 
Exec(@s) -- 成功 
exec sp_executesql @s -- 此句会报错 declare @s Nvarchar(1000)  -- 注意此处改为nvarchar(1000) 
set @s = 'select ' + @fname + ' from tableName' 
Exec(@s) -- 成功
exec sp_executesql @s -- 此句正确
3、 输出参数 
declare  @num int, 
@sqls nvarchar(4000) 
set @sqls='select count(*) from tableName' 
exec(@sqls) --如何将exec执行结果放入变量中? 
declare  @num int, 
@sqls nvarchar(4000) 
set @sqls='select @a=count(*) from tableName ' 
exec sp_executesql @sqls,N'@a int output',@num output 
select @num 

解决方案 »

  1.   

    declare @sqlwhere varchar(2000)
    select @sqlwhere=条件
    exec('select * from TABLE1 where '+@sqlwhere)
      

  2.   

    exec('select * from TABLE1 where '+@sqlwhere)
      

  3.   

    但是我前面的select 语句也是变的,如:
    select @s=@s+','+FIELD1+'=max(case shortName when '''+FIELD1+''' then FIELD2 end)' from TABLE1  WHERE @sqlwhere
    set @s = 'select FIELD1'+@s+' from TABLE1 WHERE @sqlwhere group by FIELD1 order by FIELD1' 
    exec(@s)
      

  4.   

    select @s=@s+','+FIELD1+'=max(case shortName when '''+FIELD1+''' then FIELD2 end) from TABLE1  WHERE '+@sqlwhere
    set @s = 'select FIELD1'+@s+' from TABLE1 WHERE '+@sqlwhere+' group by FIELD1 order by FIELD1' 
    exec (@s)
      

  5.   

    楼上,
    不好意思,下面这个是我的应用,刚才漏写了一些:
    select @sqlStr=@sqlStr+','+FIELD1+'=max(case FIELD1 when '''+FIELD1+''' then FIELD2 end)' from TABLE1  @sqlwhere  group by FIELD1
    set @sqlStr = 'select ID'+@sqlStr+' from TABLE1 '+@sqlwhere+'  group by ID order by ID'
    exec(@sqlStr)照你那样写,有点问题
      

  6.   

    动态生成SQL查询语句 selstr
    然后Exec sp_executesql  selstr
      

  7.   

    select @sqlStr=@sqlStr+','+FIELD1+'=max(case FIELD1 when '''+FIELD1+''' then FIELD2 end) from TABLE1 '+ @sqlwhere +' group by FIELD1'
    set @sqlStr = 'select ID'+@sqlStr+' from TABLE1 '+@sqlwhere+'  group by ID order by ID'
    exec(@sqlStr)
      

  8.   

    wangtiecheng(cappuccino):
    你这样写不行,因为
    select @sqlStr=@sqlStr+','+FIELD1+'=max(case FIELD1 when '''+FIELD1+''' then FIELD2 end) from TABLE1 '+ @sqlwhere +' group by FIELD1'
    这一句里我执行了查询,你把那些查询语句单引号括起来了
    select …… from TABLE1…… group by FIELD1 是不能用单引号的,因为我要执行,才能得到新的@sqlStr