动态sql语句基本语法
1 :普通SQL语句可以用Exec执行
eg: Select * from tableName
Exec('select * from tableName')
Exec sp_executesql N'select * from tableName'
2:字段名,表名,数据库名之类作为变量时,必须用动态SQL
eg:
declare @fname varchar(20)
set @fname = 'FiledName'
Select @fname from tableName
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)
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)
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
转载:http://bbs.youkuaiyun.com/topics/230067792
create table t_org
(
org_id int primary key identity not null,
org_name varchar(50),
org_role varchar(20)
)
insert into t_org values('优快云','1,2,3')
insert into t_org values('新浪','2,4')
insert into t_org values('javaeye','1')
insert into t_org values('腾讯','2,4')
insert into t_org values('猫扑','3,4')
insert into t_org values('IT1','1')
insert into t_org values('IT2','1')
insert into t_org values('IT3','1')
insert into t_org values('IT4','1')
insert into t_org values('论坛1','3')
insert into t_org values('论坛2','3')
insert into t_org values('论坛3','3')
insert into t_org values('搜狐','2')
insert into t_org values('雅虎','2')
insert into t_org values('****','1,2,3,4')
insert into t_org values('**测试*','16')
if exists(select 1 from sysobjects where id=object_id('query_org') and type='p' )
drop proc query_org
go
create proc query_org
@org_role varchar(20)
as
begin
declare @sql varchar(2000)
select @sql = 'select * from t_org where org_role like ''%'+@org_role+'%'''
exec (@sql)
end
if exists(select 1 from sysobjects where id=object_id('query_org_2') and type='p' )
drop proc query_org_2
go
create proc query_org_2
@org_role varchar(20)
as
begin
declare @sql varchar(2000)
select @sql = 'select * from t_org where ' + '(CHARINDEX('''+@org_role+'''+'','',org_role+'','')>0) '
-- 费了好大劲,才拼成功。 将一个正常语句,写得动态SQL里,那个引号的连接规则是什么啊?
exec (@sql)
end
-- exec query_org_2 '1'