SQL SERVER 2000存储过程中动态查询的问题

qinfei 2009-03-26 01:36:32
请花3分钟,看贴回贴,谢谢

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
ALTER PROCEDURE [dbo].[sp_TestGetReportData]
-- Add the parameters for the stored procedure here
(
@Result varchar(2000) output --声明输出变量
,@strDataBase varchar(40)
)
AS

declare @nTodayIn float --本日入库
declare @strSql varchar(2000)

set @nTodayIn=0;
set @strDataBase='UFDATA_002_2009';
set @strSql='';
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;

set @nTodayIn=0;

set @strSql='SELECT top 1 '+@nTodayIn+'= b.iquantity from '+@strDataBase +'.dbo.rdrecords b';
Exec(@strSql);

END

以上是存储过程全文。
环境:
本地机器SQL SERVER 2005
远程机器SQL SERVER 2000
上面的存储过程是保存在远程机器上面的,我在本地使用SQL SERVER 2005连接到远程机器上面打开。
@nTodayIn是变量,浮点数, b.iquantity 也是浮点数,@strDataBase 是变量,通过传参数来实现动态连接不同的数据库。

问题:
我执行的时候出现错误,提示如下
消息 8114,级别 16,状态 5,过程 sp_TestGetReportData,第 30 行
将数据类型 varchar 转换为 float 时出错。

我的疑问:
我这里是将查询到的一个浮点数写入到一个浮点变量中去,怎么出现这样的错误提示。

非常着急的问题,现在是半夜1点半了,谢谢。




...全文
168 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
dawugui 2009-03-26
  • 打赏
  • 举报
回复
动态SQL,结果存入变量?

参考:

declare @num int, 
@sqls nvarchar(4000)
set @sqls='select count(*) from tableName'
exec(@sqls)
--如何将exec执行结果放入变量中?

declare @num int,
@sqls nvarchar(4000)
set @sqls='select @a=count(*) from tableName '
exec sp_executesql @sqls,N'@a int output',@num output
select @num
htl258_Tony 2009-03-26
  • 打赏
  • 举报
回复
set ANSI_NULLS ON 
set QUOTED_IDENTIFIER ON
go
-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
ALTER PROCEDURE [dbo].[sp_TestGetReportData]
-- Add the parameters for the stored procedure here
(
@Result varchar(2000) output --声明输出变量
,@strDataBase varchar(40)
)
AS

declare @nTodayIn float --本日入库
declare @strSql varchar(2000)

set @nTodayIn=0;
set @strDataBase='UFDATA_002_2009';
set @strSql='';
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;

set @nTodayIn=0;

set @strSql='SELECT top 1 ['+ltrim(@nTodayIn)+']= b.iquantity from '+@strDataBase +'.dbo.rdrecords b';
Exec(@strSql);

END
qinfei 2009-03-26
  • 打赏
  • 举报
回复
编译可以同通过,但是在运行的时候出现错误如下:
消息 137,级别 15,状态 2,第 1 行
必须声明变量 '@strDataBase'。
0

(1 行受影响)

(1 行受影响)

请问我哪里写错了,该如何解决,谢谢。
qinfei 2009-03-26
  • 打赏
  • 举报
回复
dawugui ,你好:
按照你的写法:
declare @num int,
@sqls nvarchar(4000)
set @sqls='select count(*) from tableName'
exec(@sqls)
--如何将exec执行结果放入变量中?

declare @num int,
@sqls nvarchar(4000)
set @sqls='select @a=count(*) from tableName '
exec sp_executesql @sqls,N'@a int output',@num output
select @num

确实是可以传递参数,因为我主要是根据传过来的参数判断应该连接哪个数据库,所以我需要将上面的tableName也要作为参数变化。

当我这样测试的时候:
declare @i int,@con int,@s nvarchar(1000),@strDataBase nvarchar(100)
set @i=5
set @strDataBase='sysobjects';

select @s='select @con=count(1) from @strDataBase where ID>@i'
exec sp_executesql @s,N'@con int output,@strDataBase nvarchar(100),@i int',@con output ,@strDataBase,@i
select @con

出现错误如下:
消息 137,级别 15,状态 2,第 1 行
必须声明变量 '@strDataBase'。
0

(1 行受影响)

(1 行受影响)

请问我哪里写错了,该如何解决,谢谢。
qinfei 2009-03-26
  • 打赏
  • 举报
回复
htl258 ,你好:
set @strSql='SELECT top 1 ['+ltrim(@nTodayIn)+']= b.iquantity from '+@strDataBase +'.dbo.rdrecords b';
------------------------------------------------------------
我这里的
declare @nTodayIn float 是一个浮点数,你用ltrim左边去空格是什么意思?
我运行后返回错误:
消息 170,级别 15,状态 1,第 1 行
第 1 行: '.' 附近有语法错误。

(1 行受影响)

(1 行受影响)

--------------------严肃的分割线---------------------------

34,588

社区成员

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

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