自己要统计34个表中的行数,
用到了动态表名字,插入查询数据到新的表,记录下来。
-- =============================================
CREATE PROCEDURE [dbo].[mypro_getcount]
AS
BEGIN
declare @i int
set @i=1;
exec('delete pro_table')
while @i<35
begin
--select max(id) from loop_2
--字符串的拼接要在exec 中
exec('insert into pro_table select loopid, (max(id)-min(id))
from '+'loop_'+@i +' group by loopid having count(loopid) >1' )
set @i=@i+1;
end
end
执行 exec mypro_getcount
1、字符串的拼接,要在exec 中。
2、插入到新表
一:如果要插入目标表不存在: select * into 目标表 from 表 where ...
要注意,在select后,要用as 指定名字
exec(' select loopid as id, (max(id)-min(id)) as count into pro_table4 from '+'loop_'+@i +' group by loopid having count(loopid) >1' )-
否则报错:消息 1038,级别 15,状态 5,第 1 行
缺少对象或列名,或者对象或列名为空。对于 SELECT INTO 语句,请确保每列均具有名称。对于其他语句,请查找空的别 名。不允许使用定义为 "" 或 [] 的别名。请将别名更改为有效名称。
二:如果要插入目标表已经存在:insert into 目的表 select * from 表 where 条件
三:如果是跨数据库操作的话: 怎么把A数据库的atable表所查询的东西,全部插入到B 数据库的btable表中
select * into B.btable from A.atable where ...
四,只插入一部分 ,如果表已经存在
insert into pro_table select max(id) from loop_1----报错:消息 213,级别 16,状态 1,第 8 行 列名或所提供值的数目与表定义不匹配。
正确的: insert into pro_table(id) select max(id) from loop_1 --指明插入那一列
如果表不存在,直接用select * into 目标表 from 表 where ..., 和插入全部是一样的,因为表就不存在。