关于动态SQL

anqini 2008-09-19 11:45:40
我看书上这么些的

有个解决方案:
1.在最外层,创建包含一个虚拟列的临时表
2.在动态处理中,执行下面的任务:
2.1 修改#T,增加需要的列
2.2 修改#T,删除虚拟列。
2.3 给#T插入数据
3.回到外部级别,在一个新的批处理中访问#T

但这个解决方案有个问题
问题出现在2.3,对#T的引用将被解析到最外层的#T的架构。当解析批处理时,#T的新架构还不可用。解决办法是在另一个动态批处理中填充#T,该动态批处理位于修改#T架构的动态批处理的内部级别中。

所以新出一个解决方法:
1.在最外层,创建包含一个虚拟列的临时表
2.在动态处理中,执行下面的任务:
2.1 修改#T,增加需要的列
2.2 修改#T,删除虚拟列。
2.3 打开另一个级别的动态执行。
2.3.1 给#T插入数据

3.回到外部级别,在一个新的批处理中访问#T

这句话我不太明白,尤其是解析批处理的地方

...全文
104 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
anqini 2008-09-20
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 Garnett_KG 的回复:]
<inside sqlserver-tsql programming>吧?


其实没那么复杂,exec是在执行时期才对sql字串进行编译,解析时的物件当然是参照"当下"的状态啦。

分开来执行就行了

SQL code
use tempdb
if object_id('tempdb..#t1') is not null
drop table #t1;
go
declare @schema as varchar(100),@insert as varchar(100);

set @schema = 'col1 int,col2 int';
set @insert = 'insert into #t1 values(1,10)';



cre…
[/Quote]
大哥,你猜对了,就是那本!!哈哈~你也看过?
anqini 2008-09-20
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 Garnett_KG 的回复:]
<inside sqlserver-tsql programming>吧?


其实没那么复杂,exec是在执行时期才对sql字串进行编译,解析时的物件当然是参照"当下"的状态啦。

分开来执行就行了

SQL code
use tempdb
if object_id('tempdb..#t1') is not null
drop table #t1;
go
declare @schema as varchar(100),@insert as varchar(100);

set @schema = 'col1 int,col2 int';
set @insert = 'insert into #t1 values(1,10)';



cre…
[/Quote]

你说的”当下“就是调用这个exec之前的状态吗?
Garnett_KG 2008-09-20
  • 打赏
  • 举报
回复
<inside sqlserver-tsql programming>吧?


其实没那么复杂,exec是在执行时期才对sql字串进行编译,解析时的物件当然是参照"当下"的状态啦。

分开来执行就行了

use tempdb
if object_id('tempdb..#t1') is not null
drop table #t1;
go
declare @schema as varchar(100),@insert as varchar(100);

set @schema = 'col1 int,col2 int';
set @insert = 'insert into #t1 values(1,10)';



create table #t1(id int);

execute('alter table #t1 add '+@schema+' alter table #t1 drop column id; ')
execute(@insert)
select * from #t1


anqini 2008-09-20
  • 打赏
  • 举报
回复
2楼,首先非常感谢你的答复,这个东西我都明白,

我给你举个例子


use tempdb
if object_id('tempdb..#t1') is not null
drop table #t1;
go
declare @schema as varchar(100),@insert as varchar(100);

set @schema = 'col1 int,col2 int';
set @insert = 'insert into #t1 values(1,10)';



create table #t1(id int);
execute('alter table #t1 add '+@schema+' alter table #t1 drop column id; exec('''+@insert+''')');

--execute('alter table #t1 add '+@schema+' alter table #t1 drop column id; '+@insert+';');为什么这么些就不可以呢?说是insert的时候,不知道前面更改的列,还是往之前变更之前的表里插入数据,所以出错
dawugui 2008-09-20
  • 打赏
  • 举报
回复
动态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



dawugui 2008-09-20
  • 打赏
  • 举报
回复
好复杂.
Garnett_KG 2008-09-20
  • 打赏
  • 举报
回复
是的,就是指执行到exec的时候的状态。

34,576

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧