存储过程问题:列名 'X' 无效

玄冬Wong 2009-07-23 07:48:48
if exists(select * from sysobjects where name='fn_TaskList')
drop function fn_TaskList
go
create function fn_TaskList(
@taskSubject nvarchar(50)----任务主题
)
returns table
as
return (
SELECT [TaskInfo].[TaskID],[TaskSubject],[TaskContent],[RespEmpID] FROM [TaskInfo] where [TaskSubject] like '%'+@taskSubject+'%' or @taskSubject is null
)
go

select * from fn_TaskList( 'w' )

-----------------
----------------
if exists(select * from sysobjects where name='stro_GetTaskList')
drop procedure stro_GetTaskList
go
create procedure stro_GetTaskList
@taskSubject nvarchar(50)
as

declare @sql varchar(3000)
set @sql='select * from fn_TaskList('+@taskSubject +')'
exec(@sql)
---select * from fn_TaskList( 'w' )
go

execute stro_GetTaskList 'w'

分析时通过,在执行execute stro_GetTaskList 'w'时,报:列名'w'无效。

使用存储@sql改为:set @sql='select * from fn_TaskList('+str(@taskSubject)) +')',报错:
**********
Msg 8114, Level 16, State 5, Procedure stro_GetTaskList, Line 7
从数据类型 nvarchar 转换为 float 时出错。
**********

使用存储@sql改为:set @sql='select * from fn_TaskList('+cast(@taskSubject as nvarchar(50)) +')',报错:
**********
Msg 207, Level 16, State 1, Line 1
列名 'w' 无效。
**********

直接执行select * from fn_TaskList( 'w' )可以查到数据,说明函数没错。我试过,若给存储过程传递的是int参数,可通过并查到数据。
我是想实现这样的:
要查询的数据对应的[RespEmpID]属于一个整数集合任何一个元素(这个集合的长度不固定)。我想将程序中拼接的字符串" and( [RespEmpID] =1 or [RespEmpID]= 12 or [RespEmpID]=24 ……)"传递到存储过程中再拼接sql语句,但现在传递字符串类型报这种错。这个错误怎么解决,或者对于这种不定长度的查询条件有什么好办法?先说声谢谢!
...全文
235 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
玄冬Wong 2009-07-24
  • 打赏
  • 举报
回复
谢谢每位朋友的解答!分数分不够啊!
超维电脑科技 2009-07-24
  • 打赏
  • 举报
回复
学习了
  • 打赏
  • 举报
回复
引号少了真不行。


JonasFeng 2009-07-23
  • 打赏
  • 举报
回复
引号问题很重要的。
sdhdy 2009-07-23
  • 打赏
  • 举报
回复
set @sql='select * from fn_TaskList('''+@taskSubject +''')'
xiaoliaoyun 2009-07-23
  • 打赏
  • 举报
回复
最后用sp_executesql,避免SQL注入攻击

IF EXISTS(SELECT * FROM SYSOBJECTS WHERE NAME ='stro_GetTaskList_temp')
DROP PROCEDURE stro_GetTaskList_temp
GO
CREATE PROCEDURE stro_GetTaskList_temp
@taskSubject NVARCHAR(50)
AS
DECLARE @sql NVARCHAR(3000);

SET @sql = N'SELECT * FROM fn_TaskList(@taskSubject)';
EXEC sp_executesql @sql,N'@taskSubject nvarchar(50)',@taskSubject = @taskSubject;
GO

EXECUTE stro_GetTaskList_temp 'w'')select * from sys.tables;--'')';
EXECUTE stro_GetTaskList 'w'')select * from sys.tables;--'')';
youzhj 2009-07-23
  • 打赏
  • 举报
回复
学习学习
feixianxxx 2009-07-23
  • 打赏
  • 举报
回复
declare @sql varchar(3000)
set @sql='select * from fn_TaskList('''+@taskSubject +''')'
exec(@sql)

create table #(code varchar(20),value int)
declare @sql varchar(200)


set @sql='insert into # select ''AAA'',10'
-- AAA之前的一对单引号与之后的一对单引号分别代表一个单引号

print @sql --查看这个字符串的实际内容
/*
insert into # select 'AAA',10
*/

exec(@sql)
select * from #
/*
code value
-------------------- -----------
AAA 10
*/

--如果需要insert一个值为'A''AA的字符串,如下:
set @sql='insert into # select ''A''''AA'',10'
--两层嵌套的字符串内部,一个单引号需要经过两次转义,于是变成了4个单引号

print @sql --查看这个字符串的实际内容
/*
insert into # select 'A''AA',10
*/

exec(@sql)

select * from #
/*
code value
-------------------- -----------
AAA 10
A'AA 10
*/


drop table #
htl258_Tony 2009-07-23
  • 打赏
  • 举报
回复
if exists(select * from sysobjects where name='stro_GetTaskList')
drop procedure stro_GetTaskList
go
create procedure stro_GetTaskList
@taskSubject nvarchar(50)
as

declare @sql varchar(3000)
set @sql='select * from fn_TaskList('''+@taskSubject +''')'
exec(@sql)
---select * from fn_TaskList( 'w' )
go
的确是串内少了引号.
Yang_ 2009-07-23
  • 打赏
  • 举报
回复
拼凑SQL语句一定要注意银号
htl258_Tony 2009-07-23
  • 打赏
  • 举报
回复
try:
if exists(select * from sysobjects where name='stro_GetTaskList')
drop procedure stro_GetTaskList
go
create procedure stro_GetTaskList
@taskSubject nvarchar(50)
as

declare @sql varchar(3000)
set @sql='select * from dbo.fn_TaskList('+@taskSubject +')'
exec(@sql)
---select * from fn_TaskList( 'w' )
go
Yang_ 2009-07-23
  • 打赏
  • 举报
回复
少引号
if exists(select * from sysobjects where name='fn_TaskList')
drop function fn_TaskList
go
create function fn_TaskList(
@taskSubject nvarchar(50)----任务主题
)
returns table
as
return (
SELECT [TaskInfo].[TaskID],[TaskSubject],[TaskContent],[RespEmpID] FROM [TaskInfo] where [TaskSubject] like '%'+@taskSubject+'%' or @taskSubject is null
)
go

select * from fn_TaskList( 'w' )

-----------------
----------------
if exists(select * from sysobjects where name='stro_GetTaskList')
drop procedure stro_GetTaskList
go
create procedure stro_GetTaskList
@taskSubject nvarchar(50)
as

declare @sql varchar(3000)
set @sql='select * from fn_TaskList('''+@taskSubject +''')'
exec(@sql)
---select * from fn_TaskList( 'w' )
go

execute stro_GetTaskList 'w'
内容概要:本文围绕基于Matlab实现的面向光储充一体化社区的有序充电策略展开研究,旨在通过构建优化模型协调光伏发电、储能系统与电动汽车充电负荷之间的能量流动关系,解决综合能源系统中的充电调度问题。研究重点在于实现削峰填谷、降低用户用电成本、提升新能源就地消纳能力等多重目标。通过建立合理的数学优化模型,设定目标函数与约束条件,并借助Matlab工具完成求解与仿真分析,系统展示了如何将复杂的实际工程问题转化为可计算的优化问题,进而为社区级能源管理提供科学决策支持。代码实现部分详尽呈现了系统建模流程与算法求解细节,有助于读者深入理解有序充电策略的技术内涵与实现路径。; 适合人群:具备一定电力系统基础知识、优化理论背景及Matlab编程能力的研究生、科研人员及相关领域工程师,特别适用于从事综合能源系统、电动汽车调度、智能电网、微电网运行等方向的研究与开发人员。; 使用场景及目标:①学习光储充一体化系统的协同运行机制与能量管理策略;②掌握基于Matlab的优化建模方法与求解技术;③复现并改进有序充电调度算法,服务于学术论文撰写或实际工程项目开发;④为后续开展微电网优化调度、需求响应、分布式能源协调控制等相关课题奠定技术基础。; 阅读建议:建议结合Matlab代码逐行分析模型构建逻辑,重点关注目标函数的设计思路与各类物理、运行约束的数学表达方式,尝试调整负荷参数、新能源出力曲线或引入不同优化算法以观察策略敏感性,从而深刻把握有序充电策略的核心原理与应用潜力。

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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