该存储过程是在数据库A中写的主要错误代码如下:
CREATE PROCEDURE [dbo].[testsql]
    @TABLE      NVARCHAR(20),
@QUERY_START DATETIME,
@QUERY_DATE DATETIME
 AS
begin
--第一条查询语句是查询数据库A里表r1203
SELECT  @i11=ISNULL(SUM(AI1), 0.0) 
               FROM r1203 a  WHERE sj > CONVERT(NVARCHAR(100),@QUERY_START,20) AND sj <= CONVERT(NVARCHAR(100),@QUERY_DATE,20)
--第二条查询语句是查询数据库B里表ST_RNFL_RH 
SELECT @i22=ISNULL(SUM(dyrn), 0.0) 
                          FROM ST_RNFL_RH      WHERE (ymdhm > CONVERT(NVARCHAR(100),@QUERY_START,20)) AND 
                                (ymdhm <= CONVERT(NVARCHAR(100),@QUERY_DATE,20) AND dyrn < 150) 
····
end
go查询分析器运行时报错:
对象名 'ST_RNFL_RH' 无效。
大侠们帮忙看看,本人新手,先谢过!!

解决方案 »

  1.   

    在B中的表前制定数据库名B.dbo.ST_RNFL_RHCREATE PROCEDURE [dbo].[testsql]
      @TABLE NVARCHAR(20),
    @QUERY_START DATETIME,
    @QUERY_DATE DATETIME
     AS
    begin
    --第一条查询语句是查询数据库A里表r1203
    SELECT @i11=ISNULL(SUM(AI1), 0.0) 
      FROM r1203 a WHERE sj > CONVERT(NVARCHAR(100),@QUERY_START,20) AND sj <= CONVERT(NVARCHAR(100),@QUERY_DATE,20)
    --第二条查询语句是查询数据库B里表ST_RNFL_RH 
    SELECT @i22=ISNULL(SUM(dyrn), 0.0) 
      FROM B.dbo.ST_RNFL_RH WHERE (ymdhm > CONVERT(NVARCHAR(100),@QUERY_START,20)) AND 
      (ymdhm <= CONVERT(NVARCHAR(100),@QUERY_DATE,20) AND dyrn < 150) 
    ····
    end
    go
      

  2.   

    这个我之前试过了不行的,另外我补充点
    这个存储过程是3个参数的SELECT @i11=ISNULL(SUM(AI1), 0.0)  
      FROM r1203 a WHERE sj > CONVERT(NVARCHAR(100),@QUERY_START,20) AND sj <= CONVERT(NVARCHAR(100),@QUERY_DATE,20)
    SELECT @i11=ISNULL(SUM(AI1), 0.0)  
      FROM @TABLE a WHERE sj > CONVERT(NVARCHAR(100),@QUERY_START,20) AND sj <= CONVERT(NVARCHAR(100),@QUERY_DATE,20)
    如果将表名由参数传进来报错误:
    错误137:必须声明变量‘@TABLE’
      

  3.   


    给你的代码都贴出来吧,这几行代码谁知道你的参数@table到底是干什么的如果是想直接传表名,那么是不可以的,必须
    exec('SELECT @i11=ISNULL(SUM(AI1), 0.0)  
      FROM '+@TABLE+' a WHERE sj > CONVERT(NVARCHAR(100),@QUERY_START,20) AND sj <= '
      

  4.   


    如果想传表名,那只能动态拼接SQL语句执行了,SQL是不允许表名部分出现变量的。
      

  5.   

     CREATE PROCEDURE [dbo].[testsql]
        @TABLE      NVARCHAR(20),
    @QUERY_START DATETIME,
    @QUERY_DATE DATETIME
     AS
    beginDECLARE @SQL5 NVARCHAR(4000)
    DECLARE @SQL6 NVARCHAR(4000)declare @i1         float(8)
    declare @i2         float(8)
    set @SQL5='SELECT  @i1=ISNULL(SUM(AI1), 0.0) 
                   FROM '+@TABLE+' a  WHERE sj > '''+CONVERT(NVARCHAR(100),@QUERY_START,20)+''' AND sj <= '''+CONVERT(NVARCHAR(100),@QUERY_DATE,20)+'''
                   '
     set @SQL6='SELECT @i2=ISNULL(SUM(dyrn), 0.0)  
                              FROM ST_RNFL_RH 
                              WHERE (ymdhm > '''+CONVERT(NVARCHAR(100),@QUERY_START,20)+''') AND 
                                    (ymdhm <= '''+CONVERT(NVARCHAR(100),@QUERY_DATE,20)+''' AND dyrn < 150)'
           
    exec sp_executesql @sql5,N'@i1  float output',@i1 output
    exec sp_executesql @sql6,N'@i2  float output',@i2 output
    我在3楼补充的问题已经解决:通过这种方法可以得到@i1的值,也可以将存储过程的参数@table写入SQL语句并exec
    第一个问题依旧
    对象名 'ST_RNFL_RH' 无效。
    先谢谢楼上的朋友,谢谢你们,最后结贴会给分的