原贴内容
http://community.csdn.net/Expert/topic/5415/5415119.xml?temp=.7444574
但在实际解决中因为跟我的实际环境有些不同,而且我又不会SQL,所以还是有很多问题,希望哪位热心人帮我解决一下,我可以把具体问题传给你们,解决后500分相赠(就剩下这些了),决不食言,谢谢大家啊!
实在是太着急,没有办法了……

解决方案 »

  1.   

    .cn,QQ:331093845,一直在线等,肯定大家帮一下啊还是,不知昨晚的mengnou兄、gahade兄能不能看到,还有其他的人,失败阿……
      

  2.   

    寫一個存儲過程,用作業(job)每天執行一次就行了
    把問題email給我吧,[email protected]
      

  3.   

    谢谢rockyljt,已经寄给你了……
      

  4.   

    最好能有一些详细的步骤,因为以前我从来没有接触过SQL……
      

  5.   

    你最好把那幾個表的腳本給我,我要做測試環境
    你用的SQL2000的吧?
    右鍵你的表名-->所有工作-->產生SQL腳本
    然後把附件email給我
      

  6.   

    是SQL2000,我弄出来后给您老……
      

  7.   

    rockyljt兄,我的表只能在SQL查询分析器里面看到,但是不能在企业管理起里面看到,所以没有办法倒出来这个脚本,有什么办法能够解决吗?
      

  8.   

    --你在查詢分析器中輸入
    sp_help 你的表名
    --按Ctrl+T,再按F5
    --把結果Copy到文本文件裡傳給我
      

  9.   

    收到,但是表結構有些問題
    你的qyrainyb08表結構要與rain_table中的一樣
    iiiii  char(10)
    DateDay  char(10)
      

  10.   

    哦,这个能修改得了吗?因为这两个表是别人建好的,我自己建的只有一个qyrainjg08……可不可以有不破坏里面数据的修改的方法江涛兄?
      

  11.   

    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    SET ANSI_PADDING ON
    GO
    alter TABLE [dbo].[qyrainyb08]
    alter column [iiiii] [char](10)  NOT NULL
    go
    alter TABLE [dbo].[qyrainyb08]
    alter column [DateDay] [char](10) NOT NULL
    GO
    SET ANSI_PADDING OFF
      

  12.   

    出现了一个这样子的错误提示江涛兄
    服务器: 消息 4902,级别 16,状态 1,行 1
    无法更改表 'dbo.qyrainyb08',因为数据库 'master' 中不存在此表。
    服务器: 消息 4902,级别 16,状态 1,行 1
    无法更改表 'dbo.qyrainyb08',因为数据库 'master' 中不存在此表。
      

  13.   


    use 你所在的數據庫
    go
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    SET ANSI_PADDING ON
    GO
    alter TABLE [dbo].[qyrainyb08]
    alter column [iiiii] [char](10)  NOT NULL
    go
    alter TABLE [dbo].[qyrainyb08]
    alter column [DateDay] [char](10) NOT NULL
    GO
    SET ANSI_PADDING OFF
      

  14.   

    USE 你的數據庫名
    GOSET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    SET ANSI_PADDING ON
    GO
    alter TABLE [dbo].[qyrainjg08]
    alter column [iiiii] [char](10)   NOT NULL
    GO
    alter TABLE [dbo].[qyrainjg08]
    alter column
    [DateDay] [char](10)   NOT NULL
    GO
    alter TABLE [dbo].[qyrainjg08]
    alter column [ybspan] [varchar](20)   NULL
    GO
    alter TABLE [dbo].[qyrainjg08]
    alter column [yblj] [decimal](18, 1) NULL
    GO
    alter TABLE [dbo].[qyrainjg08]
    alter column [sklj] [decimal](18, 1) NULL
    GO
    SET ANSI_PADDING OFF
      

  15.   

    我所在的数据库是hbqxsql,还是有一个错误的提示
    服务器: 消息 5074,级别 16,状态 8,行 1
    对象 'PK_qyrainyb' 依赖于 列 'iiiii'。
    服务器: 消息 4922,级别 16,状态 1,行 1
    ALTER TABLE ALTER COLUMN iiiii 失败,因为有一个或多个对象访问此列。
    服务器: 消息 5074,级别 16,状态 8,行 1
    对象 'PK_qyrainyb' 依赖于 列 'DateDay'。
    服务器: 消息 5074,级别 16,状态 1,行 1
    对象 'PK_qyrainyb' 依赖于 列 'DateDay'。
    服务器: 消息 4922,级别 16,状态 1,行 1
    ALTER TABLE ALTER COLUMN DateDay 失败,因为有一个或多个对象访问此列。但是我在hbqxsql的用户表里没有看到有一个'PK_qyrainyb' 的表:(
    有没有什么办法能够在不修改标的情况下完成这个查询啊江涛兄?
      

  16.   

    那是因為有外鍵的緣故
    等一下,馬上搞定另外,你把預測表最近幾周的數據導到excel給我做測試
    不會導的話,在查詢分析中查出來拷貝到excel中也行
      

  17.   

    --不用很多,下面的就行
    select top 50 * from qyrainyb08 where iiiii='53889' and dateday>='20070201' and dateday<='20070228'
      

  18.   

    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    SET ANSI_PADDING ON
    GO
    alter TABLE [dbo].[qyrainyb08]
    drop CONSTRAINT [FK_qyrainyb08_rain_table]
    go
    alter TABLE [dbo].[qyrainyb08]
    alter column[iiiii] [char](10)  NOT NULL
    go
    alter TABLE [dbo].[qyrainyb08]
    alter column[DateDay] [char](10) NOT NULL
    GOSET ANSI_PADDING OFF
    GO
    ALTER TABLE [dbo].[qyrainyb08]  WITH CHECK ADD  CONSTRAINT [FK_qyrainyb08_rain_table] FOREIGN KEY([iiiii], [DateDay])
    REFERENCES [dbo].[rain_table] ([iiiii], [DateDay])
    ON UPDATE CASCADE
    ON DELETE CASCADE
    GO
    ALTER TABLE [dbo].[qyrainyb08] CHECK CONSTRAINT [FK_qyrainyb08_rain_table]
      

  19.   

    你再執行一下上面的,就可以把表結構修正了,不會影響原始數據的結果表也要改一下哦
    USE 你的數據庫名
    GOSET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    SET ANSI_PADDING ON
    GO
    alter TABLE [dbo].[qyrainjg08]
    alter column [iiiii] [char](10)   NOT NULL
    GO
    alter TABLE [dbo].[qyrainjg08]
    alter column
    [DateDay] [char](10)   NOT NULL
    GO
    alter TABLE [dbo].[qyrainjg08]
    alter column [ybspan] [varchar](20)   NULL
    GO
    alter TABLE [dbo].[qyrainjg08]
    alter column [yblj] [decimal](18, 1) NULL
    GO
    alter TABLE [dbo].[qyrainjg08]
    alter column [sklj] [decimal](18, 1) NULL
    GO
    SET ANSI_PADDING OFF
      

  20.   

    执行第一个的时候还是有些问题江涛兄,我把FK改成PK后也是同样的提示,提示如下:
    服务器: 消息 3728,级别 16,状态 1,行 1
    'FK_qyrainyb08_rain_table' 不是约束。
    服务器: 消息 3727,级别 16,状态 1,行 1
    未能除去约束。请参阅前面的错误信息。
    服务器: 消息 5074,级别 16,状态 8,行 1
    对象 'PK_qyrainyb' 依赖于 列 'iiiii'。
    服务器: 消息 4922,级别 16,状态 1,行 1
    ALTER TABLE ALTER COLUMN iiiii 失败,因为有一个或多个对象访问此列。
    服务器: 消息 5074,级别 16,状态 8,行 1
    对象 'PK_qyrainyb' 依赖于 列 'DateDay'。
    服务器: 消息 5074,级别 16,状态 1,行 1
    对象 'PK_qyrainyb' 依赖于 列 'DateDay'。
    服务器: 消息 4922,级别 16,状态 1,行 1
    ALTER TABLE ALTER COLUMN DateDay 失败,因为有一个或多个对象访问此列。
    服务器: 消息 1753,级别 16,状态 1,行 1
    列 'dbo.rain_table.iiiii' 与外键 'FK_qyrainyb08_rain_table' 中引用列 'qyrainyb08.iiiii' 的长度不同。
    服务器: 消息 1750,级别 16,状态 1,行 1
    未能创建约束。请参阅前面的错误信息。
    服务器: 消息 4917,级别 16,状态 1,行 1
    约束 'FK_qyrainyb08_rain_table' 不存在。
    服务器: 消息 4916,级别 16,状态 1,行 1
    未能启用或禁用约束。请参阅前面的错误信息。希望您老不要着急啊,我对这个真的是一窍不通……
      

  21.   

    第二个修改的表的出错提示跟第一个一样,我按照你老给的数据类型重建了一个表,名称相同,新的表已经是您老要求的类型了,重建这个表的语句如下:
    CREATE TABLE [qyrainjg08] (
    [iiiii] [char] (10) COLLATE Chinese_PRC_CI_AS NOT NULL ,
    [dateday] [char] (10) COLLATE Chinese_PRC_CI_AS NOT NULL ,
    [ybspan] [varchar] (20) COLLATE Chinese_PRC_CI_AS NOT NULL ,
    [yblj] [decimal](18, 1) NULL ,
    [sklj] [decimal](18, 1) NULL ,
    CONSTRAINT [PK_qyrainjg08] PRIMARY KEY  CLUSTERED 
    (
    [iiiii],
    [dateday],
    [ybspan]
    )  ON [PRIMARY] 
    ) ON [PRIMARY]
    GO
    您老看看还可以吗?
      

  22.   

    原因是外鍵的名字不對啊
    你自己查一下預報表,看其外鍵是不叫PK_qyrainyb
    sp_help qyrainyb08如果是的話,執行SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    SET ANSI_PADDING ON
    GO
    alter TABLE [dbo].[qyrainyb08]
    drop CONSTRAINT PK_qyrainyb --先去掉外鍵后才能改表結構
    go
    alter TABLE [dbo].[qyrainyb08]
    alter column[iiiii] [char](10)  NOT NULL
    go
    alter TABLE [dbo].[qyrainyb08]
    alter column[DateDay] [char](10) NOT NULL
    GOSET ANSI_PADDING OFF
    GO
    --再加上外鍵
    ALTER TABLE [dbo].[qyrainyb08]  WITH CHECK ADD  CONSTRAINT [FK_qyrainyb08_rain_table] FOREIGN KEY([iiiii], [DateDay])
    REFERENCES [dbo].[rain_table] ([iiiii], [DateDay])
    ON UPDATE CASCADE
    ON DELETE CASCADE
    GO
    ALTER TABLE [dbo].[qyrainyb08] CHECK CONSTRAINT [FK_qyrainyb08_rain_table]
      

  23.   

    我发现在哪里看外键约束了,呵呵,笨呀:)jg的表的外键应该是PK那一串,这一次运行好像更改了yb的这个表的iiiii和dateday的数据类型,他们俩现在都是[char](10)了,但是您老的命令里面又把yb表的外键名称改成了FK的那一串,有关系吗?我记得以前这三个表的外键都是PK开头的……先好好吃饭吧江涛兄,谢谢你的热心啊!
      

  24.   

    现在这三个表的各个字段的数据类型分别是
    [qyrainjg08]:[iiiii] [char] (10) ,[dateday] [char] (10) ,[ybspan] [varchar] (20),[yblj] [decimal](18, 1),[sklj] [decimal](18, 1)。
    [qyrainyb08]:[iiiii] [char] (10),[dateday] [char] (10),[024] [numeric](4, 1),[048] [numeric](4, 1) 一直到[168] [numeric](4, 1)。
    [rain_table]:[iiiii] [char] (10),[dateday] [char] (10) ,[r0808] [numeric](18, 2),[r2020] [numeric](18, 2)。
    这样子我们可以进行下一步了吗?
      

  25.   

    沒有關係的
    PK是主鍵,primary key
    FK是外鍵,foreign key可以了
      

  26.   

    insert [qyrainjg08]([iiiii],[DateDay],[ybspan],[yblj],[sklj])
    select rtrim(ltrim(a.iiiii)) as iiiii,rtrim(ltrim(a.dateday)) as dateday
    ,'024' as ybspan,a.[024] as yblj,b.r0808 as sklj
    from [qyrainyb08] a 
    left join [rain_table] b on a.iiiii=b.iiiii and a.dateday=replace(convert(varchar(10),dateadd(dd,1,b.dateday),120),'-','')
    union all
    select rtrim(ltrim(a.iiiii)) as iiiii,rtrim(ltrim(a.dateday)) as dateday
    ,'048' as ybspan,a.[048] as yblj,b.r0808 as sklj
    from [qyrainyb08] a 
    left join [rain_table] b on a.iiiii=b.iiiii and a.dateday=replace(convert(varchar(10),dateadd(dd,2,b.dateday),120),'-','')
    union all
    select rtrim(ltrim(a.iiiii)) as iiiii,rtrim(ltrim(a.dateday)) as dateday
    ,'072' as ybspan,a.[072] as yblj,b.r0808 as sklj
    from [qyrainyb08] a 
    left join [rain_table] b on a.iiiii=b.iiiii and a.dateday=replace(convert(varchar(10),dateadd(dd,3,b.dateday),120),'-','')
    union all
    select rtrim(ltrim(a.iiiii)) as iiiii,rtrim(ltrim(a.dateday)) as dateday
    ,'096' as ybspan,a.[096] as yblj,b.r0808 as sklj
    from [qyrainyb08] a 
    left join [rain_table] b on a.iiiii=b.iiiii and a.dateday=replace(convert(varchar(10),dateadd(dd,4,b.dateday),120),'-','')
    union all
    select rtrim(ltrim(a.iiiii)) as iiiii,rtrim(ltrim(a.dateday)) as dateday
    ,'120' as ybspan,a.[120] as yblj,b.r0808 as sklj
    from [qyrainyb08] a 
    left join [rain_table] b on a.iiiii=b.iiiii and a.dateday=replace(convert(varchar(10),dateadd(dd,5,b.dateday),120),'-','')
    union all
    select rtrim(ltrim(a.iiiii)) as iiiii,rtrim(ltrim(a.dateday)) as dateday
    ,'144' as ybspan,a.[144] as yblj,b.r0808 as sklj
    from [qyrainyb08] a 
    left join [rain_table] b on a.iiiii=b.iiiii and a.dateday=replace(convert(varchar(10),dateadd(dd,6,b.dateday),120),'-','')
    union all
    select rtrim(ltrim(a.iiiii)) as iiiii,rtrim(ltrim(a.dateday)) as dateday
    ,'168' as ybspan,a.[168] as yblj,b.r0808 as sklj
    from [qyrainyb08] a 
    left join [rain_table] b on a.iiiii=b.iiiii and a.dateday=replace(convert(varchar(10),dateadd(dd,7,b.dateday),120),'-','')
      

  27.   

    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    -- =============================================
    -- Author: Rocky
    -- Create date: 2007.03.24
    -- Description: 將指定日期之后的預測和實況結果插入到結果表[qyrainjg08]
    -- =============================================
    CREATE PROCEDURE dbo.SP_qyRainJG08
    @date smalldatetime=null
    AS
    BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    IF @date IS NULL
    SET @date = GETDATE()

    DECLARE @StrDate varchar(10) SET @StrDate=replace(convert(varchar(10),@date,120),'-','')    -- Insert statements for procedure here
    select rtrim(ltrim(a.iiiii)) as iiiii,rtrim(ltrim(a.dateday)) as dateday
    ,'024' as ybspan,a.[024] as yblj,b.r0808 as sklj into #temp
    from [qyrainyb08] a (nolock)  
    left join [rain_table] b (nolock)   on a.iiiii=b.iiiii and a.dateday=replace(convert(varchar(10),dateadd(dd,1,b.dateday),120),'-','')
    WHERE a.dateday>=@StrDate
    union all
    select rtrim(ltrim(a.iiiii)) as iiiii,rtrim(ltrim(a.dateday)) as dateday
    ,'048' as ybspan,a.[048] as yblj,b.r0808 as sklj
    from [qyrainyb08] a (nolock)  
    left join [rain_table] b (nolock)   on a.iiiii=b.iiiii and a.dateday=replace(convert(varchar(10),dateadd(dd,2,b.dateday),120),'-','')
    WHERE a.dateday>=@StrDate
    union all
    select rtrim(ltrim(a.iiiii)) as iiiii,rtrim(ltrim(a.dateday)) as dateday
    ,'072' as ybspan,a.[072] as yblj,b.r0808 as sklj
    from [qyrainyb08] a (nolock)  
    left join [rain_table] b (nolock)   on a.iiiii=b.iiiii and a.dateday=replace(convert(varchar(10),dateadd(dd,3,b.dateday),120),'-','')
    WHERE a.dateday>=@StrDate
    union all
    select rtrim(ltrim(a.iiiii)) as iiiii,rtrim(ltrim(a.dateday)) as dateday
    ,'096' as ybspan,a.[096] as yblj,b.r0808 as sklj
    from [qyrainyb08] a (nolock)  
    left join [rain_table] b (nolock)   on a.iiiii=b.iiiii and a.dateday=replace(convert(varchar(10),dateadd(dd,4,b.dateday),120),'-','')
    WHERE a.dateday>=@StrDate
    union all
    select rtrim(ltrim(a.iiiii)) as iiiii,rtrim(ltrim(a.dateday)) as dateday
    ,'120' as ybspan,a.[120] as yblj,b.r0808 as sklj
    from [qyrainyb08] a (nolock)  
    left join [rain_table] b (nolock)   on a.iiiii=b.iiiii and a.dateday=replace(convert(varchar(10),dateadd(dd,5,b.dateday),120),'-','')
    WHERE a.dateday>=@StrDate
    union all
    select rtrim(ltrim(a.iiiii)) as iiiii,rtrim(ltrim(a.dateday)) as dateday
    ,'144' as ybspan,a.[144] as yblj,b.r0808 as sklj
    from [qyrainyb08] a (nolock)  
    left join [rain_table] b (nolock)   on a.iiiii=b.iiiii and a.dateday=replace(convert(varchar(10),dateadd(dd,6,b.dateday),120),'-','')
    WHERE a.dateday>=@StrDate
    union all
    select rtrim(ltrim(a.iiiii)) as iiiii,rtrim(ltrim(a.dateday)) as dateday
    ,'168' as ybspan,a.[168] as yblj,b.r0808 as sklj
    from [qyrainyb08] a (nolock)  
    left join [rain_table] b (nolock)   on a.iiiii=b.iiiii and a.dateday=replace(convert(varchar(10),dateadd(dd,7,b.dateday),120),'-','')
    WHERE a.dateday>=@StrDate insert [qyrainjg08]([iiiii],[DateDay],[ybspan],[yblj],[sklj])
    SELECT * FROM #temp A (nolock) WHERE NOT EXISTS (SELECT 1 FROM [qyrainjg08] (nolock) where [iiiii]=A.[iiiii] and dateday=A.dateday AND [ybspan]=A.[ybspan])
    END
    GO
      

  28.   

    對不上的數據及你結果要求再email給我或貼出來至於“查询每个台站每天024一直到168共7天的预报量级和其相对应的实况量级,然后写进结果的那个表格中,再让它每个月定时运行一次就好了”
    __________________________________________________________________可以創建一個作業(job)每天執行這個存儲過程即可,每個月就不用再定時運行了
    創建作業的代碼如下:
    USE [msdb]
    GO
    /****** 物件:  Job [Job_qyRainJG08]    指令碼日期: 03/24/2007 14:14:13 ******/
    BEGIN TRANSACTION
    DECLARE @ReturnCode INT
    SELECT @ReturnCode = 0
    /****** 物件:  JobCategory [[Uncategorized (Local)]]]    指令碼日期: 03/24/2007 14:14:13 ******/
    IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'[Uncategorized (Local)]' AND category_class=1)
    BEGIN
    EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'[Uncategorized (Local)]'
    IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollbackENDDECLARE @jobId BINARY(16)
    EXEC @ReturnCode =  msdb.dbo.sp_add_job @job_name=N'Job_qyRainJG08', 
    @enabled=1, 
    @notify_level_eventlog=0, 
    @notify_level_email=0, 
    @notify_level_netsend=0, 
    @notify_level_page=0, 
    @delete_level=0, 
    @description=N'EXEC DBO.SP_qyRainJG08', 
    @category_name=N'[Uncategorized (Local)]', 
    @owner_login_name=N'sa', @job_id = @jobId OUTPUT
    IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
    /****** 物件:  Step [08]    指令碼日期: 03/24/2007 14:14:13 ******/
    EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'08', 
    @step_id=1, 
    @cmdexec_success_code=0, 
    @on_success_action=1, 
    @on_success_step_id=0, 
    @on_fail_action=2, 
    @on_fail_step_id=0, 
    @retry_attempts=0, 
    @retry_interval=0, 
    @os_run_priority=0, @subsystem=N'TSQL', 
    @command=N'EXEC DBO.SP_qyRainJG08', 
    @database_name=N'hbqxsql', 
    @flags=0
    IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
    EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1
    IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
    EXEC @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id=@jobId, @name=N'everyday', 
    @enabled=1, 
    @freq_type=4, 
    @freq_interval=1, 
    @freq_subday_type=1, 
    @freq_subday_interval=0, 
    @freq_relative_interval=0, 
    @freq_recurrence_factor=0, 
    @active_start_date=20070324, 
    @active_end_date=99991231, 
    @active_start_time=233000, 
    @active_end_time=235959
    IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
    EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)'
    IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
    COMMIT TRANSACTION
    GOTO EndSave
    QuitWithRollback:
    IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION
    EndSave:
      

  29.   

    我发现问题的原因了,您老把顺序弄错了,呵呵,估计是我说得太混乱了,比如yb08那个表20070203那一行的024那一列对应的是rain_table里4号的实况,在您老的语句中,查询出来的对应的却是2号的实况,同样048那一列对应的应该是5号的实况,您老的语句查询出来对应的是1号的实况,也就是预报的量级跟实况值翻过来了,连我自己都说得糊涂了,不知您老能不能看的懂还:(
    还有一个问题就是我想在jg08的表中把实况的雨量值转换成实况的量级,即0毫米为0.0级,0.01-9.99毫米为1.0级,10-24.99毫米为2.0级,25-49.99为3.0级,50-99.99为4.0级,100以上为5.0级,rain_table表里面的数值全都是雨量值,这个怎么在查询中转换呢?
      

  30.   

    --你在那個存儲過程最後加上下面兩句 truncate table #temp
    drop table #temp--即在查詢分析器中執行下面代碼:
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    -- =============================================
    -- Author: Rocky
    -- Create date: 2007.03.24
    -- Description: 將指定日期之后的預測和實況結果插入到結果表[qyrainjg08]
    -- =============================================
    alter PROCEDURE dbo.SP_qyRainJG08
    @date smalldatetime=null
    AS
    BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    IF @date IS NULL
    SET @date = GETDATE()

    DECLARE @StrDate varchar(10) SET @StrDate=replace(convert(varchar(10),@date,120),'-','')    -- Insert statements for procedure here
    select rtrim(ltrim(a.iiiii)) as iiiii,rtrim(ltrim(a.dateday)) as dateday
    ,'024' as ybspan,a.[024] as yblj,b.r0808 as sklj into #temp
    from [qyrainyb08] a (nolock)  
    left join [rain_table] b (nolock)   on a.iiiii=b.iiiii and a.dateday=replace(convert(varchar(10),dateadd(dd,1,b.dateday),120),'-','')
    WHERE a.dateday>=@StrDate
    union all
    select rtrim(ltrim(a.iiiii)) as iiiii,rtrim(ltrim(a.dateday)) as dateday
    ,'048' as ybspan,a.[048] as yblj,b.r0808 as sklj
    from [qyrainyb08] a (nolock)  
    left join [rain_table] b (nolock)   on a.iiiii=b.iiiii and a.dateday=replace(convert(varchar(10),dateadd(dd,2,b.dateday),120),'-','')
    WHERE a.dateday>=@StrDate
    union all
    select rtrim(ltrim(a.iiiii)) as iiiii,rtrim(ltrim(a.dateday)) as dateday
    ,'072' as ybspan,a.[072] as yblj,b.r0808 as sklj
    from [qyrainyb08] a (nolock)  
    left join [rain_table] b (nolock)   on a.iiiii=b.iiiii and a.dateday=replace(convert(varchar(10),dateadd(dd,3,b.dateday),120),'-','')
    WHERE a.dateday>=@StrDate
    union all
    select rtrim(ltrim(a.iiiii)) as iiiii,rtrim(ltrim(a.dateday)) as dateday
    ,'096' as ybspan,a.[096] as yblj,b.r0808 as sklj
    from [qyrainyb08] a (nolock)  
    left join [rain_table] b (nolock)   on a.iiiii=b.iiiii and a.dateday=replace(convert(varchar(10),dateadd(dd,4,b.dateday),120),'-','')
    WHERE a.dateday>=@StrDate
    union all
    select rtrim(ltrim(a.iiiii)) as iiiii,rtrim(ltrim(a.dateday)) as dateday
    ,'120' as ybspan,a.[120] as yblj,b.r0808 as sklj
    from [qyrainyb08] a (nolock)  
    left join [rain_table] b (nolock)   on a.iiiii=b.iiiii and a.dateday=replace(convert(varchar(10),dateadd(dd,5,b.dateday),120),'-','')
    WHERE a.dateday>=@StrDate
    union all
    select rtrim(ltrim(a.iiiii)) as iiiii,rtrim(ltrim(a.dateday)) as dateday
    ,'144' as ybspan,a.[144] as yblj,b.r0808 as sklj
    from [qyrainyb08] a (nolock)  
    left join [rain_table] b (nolock)   on a.iiiii=b.iiiii and a.dateday=replace(convert(varchar(10),dateadd(dd,6,b.dateday),120),'-','')
    WHERE a.dateday>=@StrDate
    union all
    select rtrim(ltrim(a.iiiii)) as iiiii,rtrim(ltrim(a.dateday)) as dateday
    ,'168' as ybspan,a.[168] as yblj,b.r0808 as sklj
    from [qyrainyb08] a (nolock)  
    left join [rain_table] b (nolock)   on a.iiiii=b.iiiii and a.dateday=replace(convert(varchar(10),dateadd(dd,7,b.dateday),120),'-','')
    WHERE a.dateday>=@StrDate insert [qyrainjg08]([iiiii],[DateDay],[ybspan],[yblj],[sklj])
    SELECT * FROM #temp A (nolock) WHERE NOT EXISTS (SELECT 1 FROM [qyrainjg08] (nolock) where [iiiii]=A.[iiiii] and dateday=A.dateday AND [ybspan]=A.[ybspan])

    truncate table #temp
    drop table #temp
    END
    GO
      

  31.   

    加入了
    truncate table #temp
    drop table #temp
    后出现了下面的一个错误消息:
    服务器: 消息 208,级别 16,状态 6,过程 SP_qyRainJG08,行 68
    对象名 'dbo.SP_qyRainJG08' 无效。
    我们没有创建这样子一个表好像……
      

  32.   

    --是我弄錯了,你再在查詢分析中執行一下吧
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    -- =============================================
    -- Author: Rocky
    -- Create date: 2007.03.24
    -- Description: 將指定日期之后的預測和實況結果插入到結果表[qyrainjg08]
    -- =============================================
    alter PROCEDURE dbo.SP_qyRainJG08
    @date smalldatetime=null
    AS
    BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    IF @date IS NULL
    SET @date = GETDATE()

    DECLARE @StrDate varchar(10) SET @StrDate=replace(convert(varchar(10),@date,120),'-','')    -- Insert statements for procedure here
    select rtrim(ltrim(a.iiiii)) as iiiii,rtrim(ltrim(a.dateday)) as dateday
    ,'024' as ybspan,a.[024] as yblj,b.r0808 as sklj into #temp
    from [qyrainyb08] a (nolock)  
    left join [rain_table] b (nolock)   on a.iiiii=b.iiiii and b.dateday=replace(convert(varchar(10),dateadd(dd,1,a.dateday),120),'-','')
    WHERE a.dateday>=@StrDate
    union all
    select rtrim(ltrim(a.iiiii)) as iiiii,rtrim(ltrim(a.dateday)) as dateday
    ,'048' as ybspan,a.[048] as yblj,b.r0808 as sklj
    from [qyrainyb08] a (nolock)  
    left join [rain_table] b (nolock)   on a.iiiii=b.iiiii and b.dateday=replace(convert(varchar(10),dateadd(dd,2,a.dateday),120),'-','')
    WHERE a.dateday>=@StrDate
    union all
    select rtrim(ltrim(a.iiiii)) as iiiii,rtrim(ltrim(a.dateday)) as dateday
    ,'072' as ybspan,a.[072] as yblj,b.r0808 as sklj
    from [qyrainyb08] a (nolock)  
    left join [rain_table] b (nolock)   on a.iiiii=b.iiiii and b.dateday=replace(convert(varchar(10),dateadd(dd,3,a.dateday),120),'-','')
    WHERE a.dateday>=@StrDate
    union all
    select rtrim(ltrim(a.iiiii)) as iiiii,rtrim(ltrim(a.dateday)) as dateday
    ,'096' as ybspan,a.[096] as yblj,b.r0808 as sklj
    from [qyrainyb08] a (nolock)  
    left join [rain_table] b (nolock)   on a.iiiii=b.iiiii and b.dateday=replace(convert(varchar(10),dateadd(dd,4,a.dateday),120),'-','')
    WHERE a.dateday>=@StrDate
    union all
    select rtrim(ltrim(a.iiiii)) as iiiii,rtrim(ltrim(a.dateday)) as dateday
    ,'120' as ybspan,a.[120] as yblj,b.r0808 as sklj
    from [qyrainyb08] a (nolock)  
    left join [rain_table] b (nolock)   on a.iiiii=b.iiiii and b.dateday=replace(convert(varchar(10),dateadd(dd,5,a.dateday),120),'-','')
    WHERE a.dateday>=@StrDate
    union all
    select rtrim(ltrim(a.iiiii)) as iiiii,rtrim(ltrim(a.dateday)) as dateday
    ,'144' as ybspan,a.[144] as yblj,b.r0808 as sklj
    from [qyrainyb08] a (nolock)  
    left join [rain_table] b (nolock)   on a.iiiii=b.iiiii and b.dateday=replace(convert(varchar(10),dateadd(dd,6,a.dateday),120),'-','')
    WHERE a.dateday>=@StrDate
    union all
    select rtrim(ltrim(a.iiiii)) as iiiii,rtrim(ltrim(a.dateday)) as dateday
    ,'168' as ybspan,a.[168] as yblj,b.r0808 as sklj
    from [qyrainyb08] a (nolock)  
    left join [rain_table] b (nolock)   on a.iiiii=b.iiiii and b.dateday=replace(convert(varchar(10),dateadd(dd,7,a.dateday),120),'-','')
    WHERE a.dateday>=@StrDate insert [qyrainjg08]([iiiii],[DateDay],[ybspan],[yblj],[sklj])
    SELECT * FROM #temp A (nolock) WHERE NOT EXISTS (SELECT 1 FROM [qyrainjg08] (nolock) where [iiiii]=A.[iiiii] and dateday=A.dateday AND [ybspan]=A.[ybspan])

    truncate table #temp
    drop table #temp
    END
    GO
      

  33.   

    你有沒有創建那個存儲過程SP_qyRainJG08?如果沒有的話,就將上面的alter 改為 create 執行一下至於rain_table表里面的数值全都是雨量值,这个怎么在查询中转换呢?
    馬上貼出來
      

  34.   

    SELECT [iiiii],[DateDay],[ybspan],[yblj],[sklj]
    ,实况的量级=case 
    when [sklj] is null then '實況雨量未輸入'
    when [sklj]=0   then '0毫米'
    when [sklj]=1.0 then '0.01-9.99毫米'
    when [sklj]=2.0 then '10-24.99毫米'
    when [sklj]=3.0 then '25-49.99毫米'
    when [sklj]=4.0 then '50-99.99毫米'
    when [sklj]=5.0 then '100毫米以上'
    else '其他量級'
    end
      FROM [dbo].[qyrainjg08]
    where iiiii='53889' and dateday>='20070201' and dateday<='20070228'
      

  35.   

    改成create后执行可以通过,但是jg08那个表里面的数据没有更新江涛兄,再次执行就通不过了,提示数据库中已存在名为 'SP_qyRainJG08' 的对象,重新改为alter后可以执行,但是仍然没有更新jg08的那个表,是什么地方出了问题吗?
      

  36.   

    还有您老给的这一段代码插入到什么地方呢?
    SELECT [iiiii],[DateDay],[ybspan],[yblj],[sklj]
    ,实况的量级=case 
    when [sklj] is null then '實況雨量未輸入'
    when [sklj]=0   then '0毫米'
    when [sklj]=1.0 then '0.01-9.99毫米'
    when [sklj]=2.0 then '10-24.99毫米'
    when [sklj]=3.0 then '25-49.99毫米'
    when [sklj]=4.0 then '50-99.99毫米'
    when [sklj]=5.0 then '100毫米以上'
    else '其他量級'
    end
      FROM [dbo].[qyrainjg08]
    where iiiii='53889' and dateday>='20070201' and dateday<='20070228'
      

  37.   

    你把表qyrainjg08的數據清空吧
    truncate table qyrainjg08
      

  38.   

    --再執行
    exec SP_qyRainJG08至於还有您老给的这一段代码插入到什么地方呢?
    那是查詢時用到的語句啊,你前台程序會用到
      

  39.   

    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    -- =============================================
    -- Author: Rocky
    -- Create date: 2007.03.24
    -- Description: 將指定日期之后的預測和實況結果插入到結果表[qyrainjg08]
    -- =============================================
    create PROCEDURE dbo.SP_qyRainJG08
    @date smalldatetime=null
    AS
    BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    IF @date IS NULL
    SET @date = GETDATE()

    DECLARE @StrDate varchar(10) SET @StrDate=replace(convert(varchar(10),@date,120),'-','')    -- Insert statements for procedure here
    select rtrim(ltrim(a.iiiii)) as iiiii,rtrim(ltrim(a.dateday)) as dateday
    ,'024' as ybspan,a.[024] as yblj,b.r0808 as sklj into #temp
    from [qyrainyb08] a (nolock)  
    left join [rain_table] b (nolock)   on a.iiiii=b.iiiii and b.dateday=replace(convert(varchar(10),dateadd(dd,1,a.dateday),120),'-','')
    WHERE a.dateday>=@StrDate
    union all
    select rtrim(ltrim(a.iiiii)) as iiiii,rtrim(ltrim(a.dateday)) as dateday
    ,'048' as ybspan,a.[048] as yblj,b.r0808 as sklj
    from [qyrainyb08] a (nolock)  
    left join [rain_table] b (nolock)   on a.iiiii=b.iiiii and b.dateday=replace(convert(varchar(10),dateadd(dd,2,a.dateday),120),'-','')
    WHERE a.dateday>=@StrDate
    union all
    select rtrim(ltrim(a.iiiii)) as iiiii,rtrim(ltrim(a.dateday)) as dateday
    ,'072' as ybspan,a.[072] as yblj,b.r0808 as sklj
    from [qyrainyb08] a (nolock)  
    left join [rain_table] b (nolock)   on a.iiiii=b.iiiii and b.dateday=replace(convert(varchar(10),dateadd(dd,3,a.dateday),120),'-','')
    WHERE a.dateday>=@StrDate
    union all
    select rtrim(ltrim(a.iiiii)) as iiiii,rtrim(ltrim(a.dateday)) as dateday
    ,'096' as ybspan,a.[096] as yblj,b.r0808 as sklj
    from [qyrainyb08] a (nolock)  
    left join [rain_table] b (nolock)   on a.iiiii=b.iiiii and b.dateday=replace(convert(varchar(10),dateadd(dd,4,a.dateday),120),'-','')
    WHERE a.dateday>=@StrDate
    union all
    select rtrim(ltrim(a.iiiii)) as iiiii,rtrim(ltrim(a.dateday)) as dateday
    ,'120' as ybspan,a.[120] as yblj,b.r0808 as sklj
    from [qyrainyb08] a (nolock)  
    left join [rain_table] b (nolock)   on a.iiiii=b.iiiii and b.dateday=replace(convert(varchar(10),dateadd(dd,5,a.dateday),120),'-','')
    WHERE a.dateday>=@StrDate
    union all
    select rtrim(ltrim(a.iiiii)) as iiiii,rtrim(ltrim(a.dateday)) as dateday
    ,'144' as ybspan,a.[144] as yblj,b.r0808 as sklj
    from [qyrainyb08] a (nolock)  
    left join [rain_table] b (nolock)   on a.iiiii=b.iiiii and b.dateday=replace(convert(varchar(10),dateadd(dd,6,a.dateday),120),'-','')
    WHERE a.dateday>=@StrDate
    union all
    select rtrim(ltrim(a.iiiii)) as iiiii,rtrim(ltrim(a.dateday)) as dateday
    ,'168' as ybspan,a.[168] as yblj,b.r0808 as sklj
    from [qyrainyb08] a (nolock)  
    left join [rain_table] b (nolock)   on a.iiiii=b.iiiii and b.dateday=replace(convert(varchar(10),dateadd(dd,7,a.dateday),120),'-','')
    WHERE a.dateday>=@StrDate insert [qyrainjg08]([iiiii],[DateDay],[ybspan],[yblj],[sklj])
    SELECT * FROM #temp A (nolock) WHERE NOT EXISTS (SELECT 1 FROM [qyrainjg08] (nolock) where [iiiii]=A.[iiiii] and dateday=A.dateday AND [ybspan]=A.[ybspan])

    truncate table #temp
    drop table #temp
    END
    GO
      

  40.   

    --建議你創建一個量級對照表
    USE hbqxsql
    GO
    /****** 物件:  Table [dbo].[tblLevel]    指令碼日期: 03/24/2007 15:06:28 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    SET ANSI_PADDING ON
    GO
    CREATE TABLE [dbo].[tblLevel](
    [lj] [decimal](18, 1) NOT NULL,
    [ljName] [varchar](50) not NULL,
     CONSTRAINT [PK_tblLevel] PRIMARY KEY CLUSTERED 
    (
    [lj] ASC
    ) ON [PRIMARY]
    ) ON [PRIMARY]GO
    SET ANSI_PADDING OFF--插入數據
    insert [tblLevel]
    select '0','0毫米' 
     union all select 1.0 , '0.01-9.99毫米'
     union all select  2.0 , '10-24.99毫米'
     union all select  3.0 , '25-49.99毫米'
     union all select 4.0 , '50-99.99毫米'
     union all select 5.0 , '100毫米以上'--查詢
    SELECT [iiiii],[DateDay],[ybspan],[yblj],[sklj],b.ljname
     FROM [dbo].[qyrainjg08] a (nolock) inner join tblLevel b on a.sklj=b.lj
    where iiiii='53889' and dateday>='20070201' and dateday<='20070228'
      

  41.   

    江涛兄,我有些糊涂了,这里面好几段代码,先后顺序应该是怎么样子的呢?还有您老提到的判断量级的那段代码,您老说是前台程序会用到,那我应该把这段代码放在那里,我现在执行这些代码都是在SQL查询分析器里面的查询窗口里面进行的,如果想做成自动的,应该保存在哪里让SQl自动调用呢?
    还有就是清空结果表后,再执行exec SP_qyRainJG08,再执行您老给的那段最长的代码,还是执行不出来查询结果……
      

  42.   

    我把SQL查询分析器关掉吧,重新开启一次,您老跟我说一下先后顺序,我照着做一下可以吗?