该存储过程是在数据库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' 无效。
大侠们帮忙看看,本人新手,先谢过!!
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' 无效。
大侠们帮忙看看,本人新手,先谢过!!
@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
这个存储过程是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’
给你的代码都贴出来吧,这几行代码谁知道你的参数@table到底是干什么的如果是想直接传表名,那么是不可以的,必须
exec('SELECT @i11=ISNULL(SUM(AI1), 0.0)
FROM '+@TABLE+' a WHERE sj > CONVERT(NVARCHAR(100),@QUERY_START,20) AND sj <= '
如果想传表名,那只能动态拼接SQL语句执行了,SQL是不允许表名部分出现变量的。
@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' 无效。
先谢谢楼上的朋友,谢谢你们,最后结贴会给分的