使用动态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
是的: create procedure p(@para varchar(8000)) as exec('select * from a where b in ('+@para+')') go调用: 若b是数字:exec p '1,2,3' 若b是字符串:exec p '''aaa'',''bbb'',''ccc'''
create procedure p(@para varchar) as declare @sql varchar(2000) set @sql='select * from a where b in ('+@para+')' exec(@sql) go你要确保你的那个@para参数格式是正确的才行
/* 功能:实现split功能的函数 */create function fn_split ( @inputstr varchar(8000), @seprator varchar(10) ) returns @temp table (a varchar(200)) as begin declare @i int set @inputstr = rtrim(ltrim(@inputstr)) set @i = charindex(@seprator, @inputstr) while @i >= 1 begin insert @temp values(left(@inputstr, @i - 1)) set @inputstr = substring(@inputstr, @i + 1, len(@inputstr) - @i) set @i = charindex(@seprator, @inputstr) end if @inputstr <> '\' insert @temp values(@inputstr) return end go /* --测试存储过程 */ create procedure p(@para varchar(2000)) asdeclare @s varchar(8000)set @s='select * from 商品目录 where 商品编码 in (select * from dbo.fn_split(''' + @para + ''','',''))' print @s exec (@s) go--执行 exec p '1,101' drop procedure p godrop function fn_split go
/* 功能:实现split功能的函数 */create function fn_split ( @inputstr varchar(8000), @seprator varchar(10) ) returns @temp table (a varchar(200)) as begin declare @i int set @inputstr = rtrim(ltrim(@inputstr)) set @i = charindex(@seprator, @inputstr) while @i >= 1 begin insert @temp values(left(@inputstr, @i - 1)) set @inputstr = substring(@inputstr, @i + 1, len(@inputstr) - @i) set @i = charindex(@seprator, @inputstr) end if @inputstr <> '\' insert @temp values(@inputstr) return end go /* --测试存储过程,只要输入的参数满足类似这种格式即可:'1,2,a,b,cd,6' */ create procedure p(@para varchar(2000)) --这里定义@para一定要定义字符的长度,否则系统只取第一个字符 asdeclare @s varchar(8000)set @s='select * from 商品目录 where 商品编码 in (select * from dbo.fn_split(''' + @para + ''','',''))' print @s exec (@s) go--执行 exec p '1,101,1,2,a,b,cd,6' drop procedure p godrop function fn_split go
create p(@para varchar) as exec('select * from a where b in ('+@para+') ')
使用动态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
create procedure p(@para varchar(8000))
as
exec('select * from a where b in ('+@para+')')
go调用:
若b是数字:exec p '1,2,3'
若b是字符串:exec p '''aaa'',''bbb'',''ccc'''
as
declare @sql varchar(2000)
set @sql='select * from a where b in ('+@para+')'
exec(@sql)
go你要确保你的那个@para参数格式是正确的才行
功能:实现split功能的函数
*/create function fn_split
(
@inputstr varchar(8000),
@seprator varchar(10)
)
returns @temp table (a varchar(200))
as begin
declare @i int set @inputstr = rtrim(ltrim(@inputstr))
set @i = charindex(@seprator, @inputstr) while @i >= 1
begin
insert @temp values(left(@inputstr, @i - 1)) set @inputstr = substring(@inputstr, @i + 1, len(@inputstr) - @i)
set @i = charindex(@seprator, @inputstr)
end if @inputstr <> '\'
insert @temp values(@inputstr) return
end
go
/*
--测试存储过程
*/
create procedure p(@para varchar(2000))
asdeclare @s varchar(8000)set @s='select * from 商品目录 where 商品编码 in (select * from dbo.fn_split(''' + @para + ''','',''))'
print @s
exec (@s)
go--执行
exec p '1,101'
drop procedure p
godrop function fn_split
go
功能:实现split功能的函数
*/create function fn_split
(
@inputstr varchar(8000),
@seprator varchar(10)
)
returns @temp table (a varchar(200))
as begin
declare @i int set @inputstr = rtrim(ltrim(@inputstr))
set @i = charindex(@seprator, @inputstr) while @i >= 1
begin
insert @temp values(left(@inputstr, @i - 1)) set @inputstr = substring(@inputstr, @i + 1, len(@inputstr) - @i)
set @i = charindex(@seprator, @inputstr)
end if @inputstr <> '\'
insert @temp values(@inputstr) return
end
go
/*
--测试存储过程,只要输入的参数满足类似这种格式即可:'1,2,a,b,cd,6'
*/
create procedure p(@para varchar(2000)) --这里定义@para一定要定义字符的长度,否则系统只取第一个字符
asdeclare @s varchar(8000)set @s='select * from 商品目录 where 商品编码 in (select * from dbo.fn_split(''' + @para + ''','',''))'
print @s
exec (@s)
go--执行
exec p '1,101,1,2,a,b,cd,6'
drop procedure p
godrop function fn_split
go
as
exec('select * from a where b in ('+@para+') ')