必须声明标量变量 的错误

shining1092 2014-08-17 03:37:56
直接运行 select [报告模板-PSI] from 客户汇总对比 where 客户='CD3' 可以得出正确的结果
但是运行

declare @sql varchar(max)
declare @inspection_type nvarchar(255)
declare @client_name nvarchar(255)
declare @report_model nvarchar(255)
set @sql=''
set @inspection_type='PSI'
set @client_name='CD3'
set @report_model=''
select @sql = 'select @report_model=[报告模板-'+@inspection_type + '] from 客户汇总对比 where 客户='+@client_name
exec (@sql)
print @report_model

却报错
消息 137,级别 15,状态 1,第 1 行
必须声明标量变量 "@report_model"。
请给与指导,非常感谢!
...全文
362 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
中国风 2014-08-21
  • 打赏
  • 举报
回复
这样用


declare @sql nvarchar(max)
declare @inspection_type nvarchar(255)
declare @client_name nvarchar(255)
declare @report_model nvarchar(255)
set @sql=''
set @inspection_type='PSI'
set @client_name='CD3'
set @report_model=''
select @sql = 'select @report_model=[报告模板-'+@inspection_type + '] from 客户汇总对比 where 客户=@client_name'
EXEC sys.sp_executesql @sql
						,N'@client_name nvarchar(255),@report_model nvarchar(255) output'
						,@client_name,@report_model OUTPUT
						
print @report_model
黑暗中的光芒 2014-08-21
  • 打赏
  • 举报
回复
引用 8 楼 shining1092 的回复:
[quote=引用 7 楼 MSSQL_DBA 的回复:]
	declare @sql varchar(max)
    declare @inspection_type nvarchar(255)
    declare @client_name nvarchar(255)
    declare @report_model nvarchar(255)
    set @sql=''
    set @inspection_type='PSI'
    set @client_name='CD3'
    set @sql =''
    set  @sql = 'select'+ @report_model+'=[报告模板-'+@inspection_type + '] from 客户汇总对比 where 客户='+@client_name
    exec (@sql)
    print @report_model
这样可以编译,但是@report_model得不到应有的值,通过调试查看,@report_model一直为空[/quote]
  declare @sql nvarchar(4000)
    declare @inspection_type nvarchar(255)
    declare @client_name nvarchar(255)
    declare @report_model nvarchar(255)
    set @inspection_type='PSI'
    set @client_name='CD3'
    set  @sql = 'select  @report_model =[报告模板-'+@inspection_type + '] from 客户汇总对比 where 客户='+@client_name
    exec sp_executesql @sql,N'@report_model nvarchar(255) output',@report_model   output
    print @report_model
shining1092 2014-08-20
  • 打赏
  • 举报
回复
引用 7 楼 MSSQL_DBA 的回复:
	declare @sql varchar(max)
    declare @inspection_type nvarchar(255)
    declare @client_name nvarchar(255)
    declare @report_model nvarchar(255)
    set @sql=''
    set @inspection_type='PSI'
    set @client_name='CD3'
    set @sql =''
    set  @sql = 'select'+ @report_model+'=[报告模板-'+@inspection_type + '] from 客户汇总对比 where 客户='+@client_name
    exec (@sql)
    print @report_model
这样可以编译,但是@report_model得不到应有的值,通过调试查看,@report_model一直为空
黑暗中的光芒 2014-08-20
  • 打赏
  • 举报
回复
	declare @sql varchar(max)
    declare @inspection_type nvarchar(255)
    declare @client_name nvarchar(255)
    declare @report_model nvarchar(255)
    set @sql=''
    set @inspection_type='PSI'
    set @client_name='CD3'
    set @sql =''
    set  @sql = 'select'+ @report_model+'=[报告模板-'+@inspection_type + '] from 客户汇总对比 where 客户='+@client_name
    exec (@sql)
    print @report_model
shining1092 2014-08-19
  • 打赏
  • 举报
回复
多谢提点,但是修改后出现新错误: 消息 207,级别 16,状态 1,第 1 行 列名 'CD3' 无效。 求解啊!
shining1092 2014-08-18
  • 打赏
  • 举报
回复
求解啊!各位大侠帮忙
xzb001 2014-08-18
  • 打赏
  • 举报
回复
错误提示的@statement是指你这里的“declare @sql varchar(max)”,也需要声明为nvarchar类型,修改为“declare @sql nvarchar(max)”就可以
shining1092 2014-08-17
  • 打赏
  • 举报
回复
小弟初学,照葫芦画瓢改写如下:

	declare @sql varchar(max)
	declare @inspection_type nvarchar(255)
	declare @client_name nvarchar(255)
	declare @report_model1 nvarchar(255)
	set @sql=''
	set @inspection_type='PSI'
	set @client_name='CD3'
	select @sql = 'select @report_model=[报告模板-'+@inspection_type + '] from 客户汇总对比 where 客户='+@client_name
    exec sp_executesql @sql, N'@report_model nvarchar(255) output', @report_model1 out
    print @report_model1
得到错误提示: 消息 214,级别 16,状态 2,过程 sp_executesql,第 1 行 过程需要类型为 'ntext/nchar/nvarchar' 的参数 '@statement'。 请赐予一段更正代码,非常感谢!
LongRui888 2014-08-17
  • 打赏
  • 举报
回复
给你一个例子,修改成这样就行:
DECLARE @sumcount INT
DECLARE @tmpSQL NVARCHAR(1000)
DECLARE @TABLENAME  VARCHAR(50)
SELECT @TABLENAME = ' sys.objects ' --表名变量赋值

SELECT @tmpSQL = 'select @sum = convert(varchar(50),count(object_id)) from ' + @TABLENAME 


exec sp_executesql @tmpsql,
                   N'@sum int output',
                   @sumcount out

print @sumcount
LongRui888 2014-08-17
  • 打赏
  • 举报
回复
要输出返回值,必须要用 sp_executesql 存储过程来实现

22,294

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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