我想写个存储过程来实现

changjian2008 2010-11-18 09:31:04

要从ip分别为192.168.0.1 和192.168.0.2 的数据库为 dongning和ndongning 的每天生成的表里 (比如:表名为“a20101108”和“q20101108”这个是每天自动生成一个表) 读取1-2个字段(字段如:南桥煤量、北桥煤量)的所有数据(数据是每分钟一条从其他地方传过来的) 提取这些数据逐条 插入到我的新表里 新表在另一台ip为192.168.0.3的服务器上, 表名也是根据日期自动生成的(比如:a20101109)也需要存储过程来实现(判断如果表还不存在就生成一个如果存在就把要插入的数据插入进去) 数据库均为sql 2000 sa 密码均为空

不知道我说的明不明白 希望各位大侠 帮忙解决一下 谢谢了 高分相送!!
...全文
177 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
changjian2008 2011-02-13
  • 打赏
  • 举报
回复
这个存储过程是 建立完事了 表也能自动创建了 但是就是不没有数据传过来 是怎么回事呢?是不是缺少什么用户 ?
AcHerat 元老 2011-02-12
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 changjian2008 的回复:]
各位高人们 我的问题又来了
我刚用上这个存储过程!!
弄了半天也没弄明白!!

SQL code
create proc pp
as
declare @sql varchar(4000)
declare @s1 varchar(100),
@s2 varchar(100),
@s3 varchar(100)
set @s1='a'+conve……
[/Quote]


/*
这种情况,一般是因为,在sqlserver中建立了针对其他数据库的链接,并且要在存储过程里面,调用该连接数据,直接创建存储过程汇报上面的错误,一种比较懒人的方法是,

打开SQL查询分析器,将该存储过程代码,拷贝过来,直接执行,在这里系统会默认代上 ANSI_NULLS 和 ANSI_WARNINGS 的值,然后刷新企业管理器,就可以看到了,以后就可以正常的修改。
*/
changjian2008 2011-02-12
  • 打赏
  • 举报
回复
比如呢 大哥说说呗 怎么做比较好!!
rd16 2011-02-10
  • 打赏
  • 举报
回复
我感觉这种写VBS脚本比用SQL脚本更好啊.

写个VBScript脚本做成"计划任务"里每天定点执行比好.
changjian2008 2011-02-10
  • 打赏
  • 举报
回复
顶一下 都上班了 大家帮我看看啊!!
changjian2008 2011-01-26
  • 打赏
  • 举报
回复
怎么 没有人 来呢 帮我看看啊 谢谢了 各位大虾!!
changjian2008 2011-01-19
  • 打赏
  • 举报
回复
这里还有个问题就是 每个表里都有一个 时间字段他们俩个 服务器时间不一定一致 任取一个时间就可以请问怎么处理!!谢谢!!dongning这里的时间字段叫“采集时间” ndongning这里的时间字段叫“采集时间”
changjian2008 2011-01-19
  • 打赏
  • 举报
回复
各位高人们 我的问题又来了
我刚用上这个存储过程!!
弄了半天也没弄明白!!
create proc pp
as
declare @sql varchar(4000)
declare @s1 varchar(100),
@s2 varchar(100),
@s3 varchar(100)
set @s1='a'+convert(varchar(8),getdate(),112) -- 192.168.0.1 中今天生成的表名
set @s2='q'+convert(varchar(8),getdate(),112) -- 192.168.0.2 中今天生成的表名
set @s3='a'+convert(varchar(8),getdate()+1,112) -- 192.168.0.3 中今天生成的表名

if object_id(@s3)is null
begin
set @sql='create table '+@s3+'(东桥原煤量 int,东桥原煤量累计 int,老厂石灰石量累计 int,老厂脱硫消耗电量 int,新厂石灰石量累计 int,新厂脱硫消耗电量 int,date datetime)'
exec(@sql)
end

-- 判断192.168.0.1 的表存在
if exists (select 1 from openrowset( 'SQLOLEDB', '192.168.0.1'; 'sa';'' , gongkong.dbo.sysobjects) where name=@s1)
begin
set @sql='insert '+@s3+ ' select * from openrowset( ''SQLOLEDB'', ''192.168.0.1''; ''sa'';'''' , ''select 东桥原煤量,东桥原煤量累计, from dongning.dbo.'+@s1+''')'
exec(@sql)
end


-- 判断192.168.0.2 的表存在
if exists (select 1 from openrowset( 'SQLOLEDB', '192.168.0.2'; 'sa';'' , ngongkong.dbo.sysobjects) where name=@s2)
begin
set @sql='insert '+@s3+ ' select * from openrowset( ''SQLOLEDB'', ''192.168.0.2''; ''sa'';'''' , ''select 老厂石灰石量累计,老厂脱硫消耗电量,新厂石灰石量累计,新厂脱硫消耗电量 from ndongning.dbo.'+@s2+''')'
exec(@sql)
end

go

建立存储过程的时候语法没有问题可是他提示我“错误7405:异类查询要求为连接设置ANSI_NULLS和ANSI_WARNINGS选项,这将确保一致的查询语句请启动这些选项,然后发出查询”

请问这是怎么回事 谢谢大家了!!
changjian2008 2011-01-19
  • 打赏
  • 举报
回复
大家来帮忙啊 谢谢了 加分!!
chang1216 2011-01-19
  • 打赏
  • 举报
回复
同事的问题 我也没解决了 大家帮他看看吧!!
Waldenz 2010-11-19
  • 打赏
  • 举报
回复
建好作业
其他都是基本的sql语句了
abuying 2010-11-18
  • 打赏
  • 举报
回复
二个服务器必须想到链接了,才可以读取数据!
所以使用 openrowset,打开远程数据库
如 5L所示
dawugui 2010-11-18
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 changjian2008 的回复:]
这个我怎么感觉是在 192.168.0.3 上执行呢 不太清楚 请明示 谢谢了 实在是一头雾水啊
[/Quote]
只要你三个服务器链接上了,放哪个都一样。

不过建议放在3上面。
华夏小卒 2010-11-18
  • 打赏
  • 举报
回复
create proc pp
as
declare @sql varchar(4000)
declare @s1 varchar(100),
@s2 varchar(100),
@s3 varchar(100)
set @s1='a'+convert(varchar(8),getdate(),112) -- 192.168.0.1 中今天生成的表名
set @s2='q'+convert(varchar(8),getdate(),112) -- 192.168.0.2 中今天生成的表名
set @s3='a'+convert(varchar(8),getdate()+1,112) -- 192.168.0.3 中今天生成的表名

if object_id(@s3)is null
begin
set @sql='create table '+@s3+'(南桥煤量 int,北桥煤量 int,date datetime)'
exec(@sql)
end

-- 判断192.168.0.1 的表存在
if exists (select 1 from openrowset( 'SQLOLEDB', '192.168.0.1'; 'sa';'' , dongning.dbo.sysobjects) where name=@s1)
begin
set @sql='insert '+@s3+ ' select * from openrowset( ''SQLOLEDB'', ''192.168.0.1''; ''sa'';'''' , ''select 南桥煤量,北桥煤量 from dongning.dbo.'+@s1+''')'
exec(@sql)
end


-- 判断192.168.0.2 的表存在
if exists (select 1 from openrowset( 'SQLOLEDB', '192.168.0.2'; 'sa';'' , ndongning.dbo.sysobjects) where name=@s2)
begin
set @sql='insert '+@s3+ ' select * from openrowset( ''SQLOLEDB'', ''192.168.0.2''; ''sa'';'''' , ''select 南桥煤量,北桥煤量 from ndongning.dbo.'+@s2+''')'
exec(@sql)
end

go

放到1楼的job中调用
changjian2008 2010-11-18
  • 打赏
  • 举报
回复
这个我怎么感觉是在 192.168.0.3 上执行呢 不太清楚 请明示 谢谢了 实在是一头雾水啊
dawugui 2010-11-18
  • 打赏
  • 举报
回复
然后做个存储过程。
大致如下:
create proc my_proc @dt varchar(8)
as
begin
--需要动态SQL语句
declare @sql as varchar(1000)
set @sql = 'if object_id(''[192.168.0.3].dongning.dbo.a' + @dt + '') is null create table ...'
exec(@sql)
set @sql = 'insert into [192.168.0.3].dongning.dbo.a' + @dt + ' select * from [192.168.0.1].dongning.dbo.a' + convert(varchar(8),cast(@dt as datetime) - 1,120)
exec(@sql)
set @sql = 'insert into [192.168.0.3].dongning.dbo.a' + @dt + ' select * from [192.168.0.2].dongning.dbo.a' + convert(varchar(8),cast(@dt as datetime) - 1,120)
exec(@sql)
end
changjian2008 2010-11-18
  • 打赏
  • 举报
回复
哥们帮忙写一下吧 我是个菜鸟 写不出来啊 谢谢了 !!
dawugui 2010-11-18
  • 打赏
  • 举报
回复
首先你先建立一个定时作业。
定时作业的制定

企业管理器
--管理
--SQL Server代理
--右键作业
--新建作业
--"常规"项中输入作业名称
--"步骤"项
--新建
--"步骤名"中输入步骤名
--"类型"中选择"Transact-SQL 脚本(TSQL)"
--"数据库"选择执行命令的数据库
--"命令"中输入要执行的语句:
EXEC 存储过程名 ... --该存储过程用于创建表

--确定
--"调度"项
--新建调度
--"名称"中输入调度名称
--"调度类型"中选择你的作业执行安排
--如果选择"反复出现"
--点"更改"来设置你的时间安排


然后将SQL Agent服务启动,并设置为自动启动,否则你的作业不会被执行

设置方法:
我的电脑--控制面板--管理工具--服务--右键 SQLSERVERAGENT--属性--启动类型--选择"自动启动"--确定.
changjian2008 2010-11-18
  • 打赏
  • 举报
回复
谢谢大家了 我先看一下 这个要出差才能用上 现在没法测试 完事 马上结贴 谢谢了

34,593

社区成员

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

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