34,575
社区成员
发帖
与我相关
我的任务
分享
动态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 proc p_lee_update_prodect
as
begin
if exists (select name from sysobjects where name ='v_prodect_info' and type ='V')
exec('DROP VIEW v_prodect_info')
exec('create VIEW v_prodect_info
as
select * from sbd_prodect_info')
declare
@ll_row int
select @ll_row = count(distinct(a.code_id)) from sbd_prodect_original a,sbd_prodect_info b where a.code_id <> b.code_id
if @ll_row > = 1
SELECT distinct information.code_id,
information.code_name,
'三边封',
information.spec_longth,
information.spec_width,
10000,
'A',
information.publish_longth,
information.publish_per,
case when information.made_order ='横' then 1 else 2 end,
case
when information.made_layer ='单' then 1
when information.made_layer ='双' then 2
when information.made_layer ='三' then 3
when information.made_layer ='四' then 4
else 5
end,
case when information.made_type ='是' then 'yes' else 'no' end,
information.color_count,
information.ink_type,
information.color_note
into sbd_prodect_info
FROM sbd_prodect_original
join v_prodect_info as information --这里用了别名
on sbd_prodect_original.code_id <> information.code_id --因为上面用了别名,所以被别名接管了,表名找不到
end
create proc p_lee_update_prodect
as
begin
if exists (select name from sysobjects where name ='v_prodect_info' and type ='V')
DROP VIEW v_prodect_info
EXEC('
create VIEW v_prodect_info
as
select * from sbd_prodect_info
')
declare
@ll_row int
select @ll_row = count(distinct(a.code_id)) from sbd_prodect_original a,sbd_prodect_info b where a.code_id <> b.code_id
if @ll_row > = 1
SELECT distinct information.code_id,
information.code_name,
'三边封',
information.spec_longth,
information.spec_width,
10000,
'A',
information.publish_longth,
information.publish_per,
case when information.made_order ='横' then 1
else 2 end,
case when information.made_layer ='单' then 1
when information.made_layer ='双' then 2
when information.made_layer ='三' then 3
when information.made_layer ='四' then 4
else 5 end,
case when information.made_type ='是' then 'yes'
else 'no' end,
information.color_count,
information.ink_type,
information.color_note
into sbd_prodect_info
FROM sbd_prodect_original join v_prodect_info as information
on sbd_prodect_original.code_id <> v_prodect_info.code_id
end