存储过程问题:列名 '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语句,但现在传递字符串类型报这种错。这个错误怎么解决,或者对于这种不定长度的查询条件有什么好办法?先说声谢谢!
...全文
149 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'

27,579

社区成员

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

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