create table #(code varchar(20),value int) declare @sql varchar(200) set @sql='insert into # select ''AAA'',10' -- AAA之前的一对单引号与之后的一对单引号分别代表一个单引号print @sql --查看这个字符串的实际内容 /* insert into # select 'AAA',10 */exec(@sql) select * from # /* code value -------------------- ----------- AAA 10 */--如果需要insert一个值为"A'AA"的字符串,如下: set @sql='insert into # select ''A''''AA'',10' --两层嵌套的字符串内部,一个单引号需要经过两次转义,于是变成了4个单引号print @sql --查看这个字符串的实际内容 /* insert into # select 'A''AA',10 */exec(@sql)select * from # /* code value -------------------- ----------- AAA 10 A'AA 10 */ drop table #
--动态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
引用字符 加一对单引号. 'select * from tb where col=' + 'abcd' + ' and true' 字符如果是变量值,再加两对单引号. 'select * from tb where col='''+ @colval+''' and true' 如果字符是语句的结尾,加四个单引号.'select * from tb where col=''' +@colval+'''' 如果引用的是数值,则只要加一对: 'select * from tb where col='+ @intval +' and true' 如果引用的数值,且为语句结尾,则后面的单引号也不要:'select * from tb where col=' +@intval
create proc query_org @org_role varchar(20) as begin declare @sql varchar(2000) set @sql = 'select * from t_org where ','+org_role+',' like ''%,'+@org_role+',%''' exec (@sql) end--or: create proc query_org @org_role varchar(20) as select * from t_org where charindex(','+@org_role+',', ','+org_role+',')>0
--第一个掉了引号: create proc query_org @org_role varchar(20) as begin declare @sql varchar(2000) set @sql = 'select * from t_org where '',''+org_role+'','' like ''%,'+@org_role+',%''' exec (@sql) end
如:
显示 roy'select 'roy'''exec('select ''roy''''''')--动态写法,引号要输入=引号*2次,最外层的两个是不计算的
declare @sql varchar(200)
set @sql='insert into # select ''AAA'',10'
-- AAA之前的一对单引号与之后的一对单引号分别代表一个单引号print @sql --查看这个字符串的实际内容
/*
insert into # select 'AAA',10
*/exec(@sql)
select * from #
/*
code value
-------------------- -----------
AAA 10
*/--如果需要insert一个值为"A'AA"的字符串,如下:
set @sql='insert into # select ''A''''AA'',10'
--两层嵌套的字符串内部,一个单引号需要经过两次转义,于是变成了4个单引号print @sql --查看这个字符串的实际内容
/*
insert into # select 'A''AA',10
*/exec(@sql)select * from #
/*
code value
-------------------- -----------
AAA 10
A'AA 10
*/
drop table #
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
字符如果是变量值,再加两对单引号. 'select * from tb where col='''+ @colval+''' and true'
如果字符是语句的结尾,加四个单引号.'select * from tb where col=''' +@colval+''''
如果引用的是数值,则只要加一对: 'select * from tb where col='+ @intval +' and true'
如果引用的数值,且为语句结尾,则后面的单引号也不要:'select * from tb where col=' +@intval
create proc query_org
@org_role varchar(20)
as
begin
declare @sql varchar(2000)
set @sql = 'select * from t_org where ','+org_role+',' like ''%,'+@org_role+',%'''
exec (@sql)
end--or:
create proc query_org
@org_role varchar(20)
as
select * from t_org where charindex(','+@org_role+',', ','+org_role+',')>0
--第一个掉了引号:
create proc query_org
@org_role varchar(20)
as
begin
declare @sql varchar(2000)
set @sql = 'select * from t_org where '',''+org_role+'','' like ''%,'+@org_role+',%'''
exec (@sql)
end
lzselect ''''
select ''''''运行看看,就懂了
不应该用 动态SQL ?