请教个问题:到底错在哪里?

cloverlay 2017-11-29 08:36:16
写语句如下:
declare @table_id int,@sql_getid nvarchar(2000)
set @sql_getid='select @table_id_int = [id] from 数据分析.dbo.sysobjects
where name =''费项分类表'''
exec sp_executesql @sql_getid , N'@table_id_int int output' , @table_id output
select @sql_getid [@sql_getid],@table_id [@table_id] --调试备用
执行结果如下:
@sql_getid @table_id
select @table_id_int = [id] from 数据分析.dbo.sysobjects where name ='费项分类表' 715865617
没有报错的提示;

然后改写到存储过程中去:
declare @table_id int,@sql_getid nvarchar(2000)
set @sql_getid='select @table_id_int = [id] from ' +@dbname+ '.' +@ownername+ '.sysobjects
where name =''' +@tablename+ ''''
exec sp_executesql @sql_getid , N'@table_id_int int output' , @table_id output
select @sql_getid [@sql_getid],@table_id [@table_id] --调试备用
执行结果如下:
@sql_getid @table_id
select @table_id_int = [id] from 数据分析.dbo.sysobjects where name ='费项分类表' 715865617
还有一条报错信息:
消息 137,级别 15,状态 1,第 1 行
必须声明标量变量 "@table_id_int"。

这个标量变量@table_id_int在整篇存储过程中只有以上这段代码中出现。
到底错在哪里?
谢谢各位大神~~
...全文
120 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
cloverlay 2017-11-30
  • 打赏
  • 举报
回复
yenange版主:谢谢您及时的回复。都有一不留神的时候,不必在意。 回复的存储过程确实是没问题,谢谢。 这个问题是我在改以前初学时写的一个存储过程的时候出现的问题,现在想把这个工具性的存储过程改成一个通用性强一些,输出能力更强、输出模式更多的工具。 这个存储过程当初写得很长而且很乱,就不贴出来浪费大家时间了,我有时间的时候自己慢慢改。 不过还是缩小了问题的范围,谢谢了。
吉普赛的歌 版主 2017-11-30
  • 打赏
  • 举报
回复
引用 5 楼 cloverlay 的回复:
看来都以为我初心写错了,而且自己没发现。 把能出结果的改了一下,说明这个语法是没问题的: create table test(费项 nvarchar(50))on [PRIMARY] declare @table_id int,@sql_getid nvarchar(2000) set @sql_getid='select @table_id_int = [id] from sysobjects where name =''test''' exec sp_executesql @sql_getid , N'@table_id_int int output' , @table_id output select @sql_getid [@sql_getid],@table_id [@table_id] --调试备用 drop table test 结果也贴一下: 所以,大家别纠结这个了。 关键是改成存储过程怎么会先取得正确结果,然后报错?
确实是没有问题, 是我没有弄清。 下面这个存储过程是没有问题的:
USE tempdb
GO
IF OBJECT_ID('Proc_Test') IS NOT NULL
    DROP PROC Proc_Test
GO
CREATE PROC Proc_Test
AS
BEGIN
	SET NOCOUNT ON
	IF OBJECT_ID('test') IS NOT NULL DROP TABLE test
	CREATE TABLE test
	(
		费项 NVARCHAR(50)
	)ON [PRIMARY]
	
	DECLARE @table_id      INT,
	        @sql_getid     NVARCHAR(2000) 
	
	SET @sql_getid = 
	    'select @table_id_int = [id] from  sysobjects where name =''test'''
	
	EXEC sp_executesql @sql_getid,
	     N'@table_id_int int output',
	     @table_id OUTPUT
	
	SELECT @sql_getid [@sql_getid],
	       @table_id [@table_id] --调试备用 
	
	DROP TABLE test
END
GO
EXEC Proc_Test
cloverlay 2017-11-29
  • 打赏
  • 举报
回复
看来都以为我初心写错了,而且自己没发现。
把能出结果的改了一下,说明这个语法是没问题的:

create table test(费项 nvarchar(50))on [PRIMARY]

declare @table_id int,@sql_getid nvarchar(2000)

set @sql_getid='select @table_id_int = [id] from sysobjects where name =''test'''

exec sp_executesql @sql_getid , N'@table_id_int int output' , @table_id output

select @sql_getid [@sql_getid],@table_id [@table_id] --调试备用

drop table test

结果也贴一下:


所以,大家别纠结这个了。

关键是改成存储过程怎么会先取得正确结果,然后报错?
cloverlay 2017-11-29
  • 打赏
  • 举报
回复
请仔细看一下这条能正确运行,取得结果而且不报错的语句:

说明这个是没问题的。

我的问题是:为什么改成存储过程会报错?(可是同时还是取得了正确的ID?)
cloverlay 2017-11-29
  • 打赏
  • 举报
回复
yenange版主:不是这个问题。
我按照你改的替换,结果还是报错。报错信息完全一样,而且执行结果没取到ID。


你试一下,把我的上一条语句改为你自己机器的某个实际的表名称,是有正确结果而且不报错的。
  • 打赏
  • 举报
回复
第一句的declare 定义的 名称 @table_id 下面用的是@table_id_int
吉普赛的歌 版主 2017-11-29
  • 打赏
  • 举报
回复

你的变量名前后都对不上, 不异常才怪。

改成这样:
declare @table_id_int int,@sql_getid nvarchar(2000) 
set @sql_getid='select @table_id_int = [id] from ' +@dbname+ '.' +@ownername+ '.sysobjects
where name =''' +@tablename+ ''''
exec sp_executesql @sql_getid , N'@table_id_int int output' , @table_id_int output

34,575

社区成员

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

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