自定义表值函数中不能使用insert exec

sjylove 2009-12-17 03:19:00

CREATE FUNCTION wscfn_GetPersonInfoAndCustomInfo
(
@keyWords varchar(100)
)
RETURNS @temp table
(
personID uniqueidentifier ,
personName nvarchar(50),
departmentID uniqueidentifier,
departmentName nvarchar(255),
customID uniqueidentifier,
customName nvarchar(255),
accountID varchar(20)
)
AS
BEGIN
declare @sql varchar(5000)
set @sql = '
select p.personID,
p.CName PersonName,
d.departmentID,
d.DepartmentName,
c.CustomID,
c.CName CustomName,
a.AccountID
from TBCustomDepartment d,
TBPersonInDepartment pd,
TBPersonBaseInf p,
TBCustomBaseInf c,
TBAccountPerson a
where d.CustomID = c.CustomID
and d.DepartmentID = pd.DepartmentID
and pd.PersonID = p.PersonID
and a.PersonID = p.PersonID'
if(@keyWords != null and RTRIM(LTRIM(@keyWords)) !='' )
begin
if(@keyWords like 'w%' or @keyWords like 'W%' )
set @sql = @sql +' and a.AccountID like ''%'+@keyWords+'%'''
else
set @sql = @sql +' and c.CName like ''%'+@keyWords+'%'''
end
insert into @temp exec(@sql)
return
END
GO



错误提示:
在函数内的 'INSERT EXEC' 中对带副作用的或依赖于时间的运算符的使用无效。

请大家指点
...全文
529 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
sjylove 2009-12-17
  • 打赏
  • 举报
回复
不太明白。
我这人脑袋不怎么灵活
SQL77 2009-12-17
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 sjylove 的回复:]
引用 12 楼 sql77 的回复:
引用 11 楼 sjylove 的回复:
引用 9 楼 dawugui 的回复:
引用 3 楼 sjylove 的回复:
引用 1 楼 dawugui 的回复:
函数中不能操作数据表(insert , update , delete ...),但可以操作表变量。


@temp 不算表变量么?
能说详细点么?

函数中不能使用动态SQL.例如:exec ...


那对于我这个函数,由什么好点的解决方案么?


改成过程


我需要用这个函数返回的结果集啊......
用存储过程的话,很麻烦吧。
[/Quote]
你上帖不是问了吗
可以插入一个表,执行EXCE返回给另一表
sjylove 2009-12-17
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 sql77 的回复:]
引用 11 楼 sjylove 的回复:
引用 9 楼 dawugui 的回复:
引用 3 楼 sjylove 的回复:
引用 1 楼 dawugui 的回复:
函数中不能操作数据表(insert , update , delete ...),但可以操作表变量。


@temp 不算表变量么?
能说详细点么?

函数中不能使用动态SQL.例如:exec ...


那对于我这个函数,由什么好点的解决方案么?


改成过程
[/Quote]

我需要用这个函数返回的结果集啊......
用存储过程的话,很麻烦吧。
SQL77 2009-12-17
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 sjylove 的回复:]
引用 9 楼 dawugui 的回复:
引用 3 楼 sjylove 的回复:
引用 1 楼 dawugui 的回复:
函数中不能操作数据表(insert , update , delete ...),但可以操作表变量。


@temp 不算表变量么?
能说详细点么?

函数中不能使用动态SQL.例如:exec ...


那对于我这个函数,由什么好点的解决方案么?

[/Quote]
改成过程
sjylove 2009-12-17
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 dawugui 的回复:]
引用 3 楼 sjylove 的回复:
引用 1 楼 dawugui 的回复:
函数中不能操作数据表(insert , update , delete ...),但可以操作表变量。


@temp 不算表变量么?
能说详细点么?

函数中不能使用动态SQL.例如:exec ...
[/Quote]

那对于我这个函数,由什么好点的解决方案么?
sjylove 2009-12-17
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 fredrickhu 的回复:]
用表变量
[/Quote]

修改后的结果:

alter FUNCTION wscfn_GetPersonInfoAndCustomInfo
(
@keyWords varchar(100)
)
RETURNS table
AS
BEGIN
declare @temp table
(
personID uniqueidentifier ,
personName nvarchar(50),
departmentID uniqueidentifier,
departmentName nvarchar(255),
customID uniqueidentifier,
customName nvarchar(255),
accountID varchar(20)
)
declare @sql varchar(5000)
set @sql = '
select p.personID,
p.CName PersonName,
d.departmentID,
d.DepartmentName,
c.CustomID,
c.CName CustomName,
a.AccountID
from TBCustomDepartment d,
TBPersonInDepartment pd,
TBPersonBaseInf p,
TBCustomBaseInf c,
TBAccountPerson a
where d.CustomID = c.CustomID
and d.DepartmentID = pd.DepartmentID
and pd.PersonID = p.PersonID
and a.PersonID = p.PersonID'
if(@keyWords != null and RTRIM(LTRIM(@keyWords)) !='' )
begin
if(@keyWords like 'w%' or @keyWords like 'W%' )
set @sql = @sql +' and a.AccountID like ''%'+@keyWords+'%'''
else
set @sql = @sql +' and c.CName like ''%'+@keyWords+'%'''
end
insert into @temp exec(@sql)
return @temp
END
GO





错误提示:

消息 137,级别 15,状态 2,过程 wscfn_GetPersonInfoAndCustomInfo,第 49 行
必须声明标量变量 "@temp"。
消息 102,级别 15,状态 31,过程 wscfn_GetPersonInfoAndCustomInfo,第 51 行
'BEGIN' 附近有语法错误。



请指教
dawugui 2009-12-17
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 sjylove 的回复:]
引用 1 楼 dawugui 的回复:
函数中不能操作数据表(insert , update , delete ...),但可以操作表变量。


@temp 不算表变量么?
能说详细点么?
[/Quote]
函数中不能使用动态SQL.例如:exec ...
SQL77 2009-12-17
  • 打赏
  • 举报
回复
函数中不能用EXCE存储过程
xman_78tom 2009-12-17
  • 打赏
  • 举报
回复
在 SQL SERVER 2000 中,不能对表变量使用 SELECT INTO 和 INSERT INTO EXEC 语句;而 SQL SERVER 2005 支持对表变量使用 INSERT INTO EXEC 语句。
sjylove 2009-12-17
  • 打赏
  • 举报
回复

declare @temp table
(
personID uniqueidentifier ,
personName nvarchar(50),
departmentID uniqueidentifier,
departmentName nvarchar(255),
customID uniqueidentifier,
customName nvarchar(255),
accountID varchar(20)
)

insert into @temp exec(@sql)
return @temp





是这样么?
xman_78tom 2009-12-17
  • 打赏
  • 举报
回复
UDF 定义中不能使用动态语句。
sgtzzc 2009-12-17
  • 打赏
  • 举报
回复
放到end前面试试
sjylove 2009-12-17
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 dawugui 的回复:]
函数中不能操作数据表(insert , update , delete ...),但可以操作表变量。
[/Quote]

@temp 不算表变量么?
能说详细点么?
--小F-- 2009-12-17
  • 打赏
  • 举报
回复
用表变量
dawugui 2009-12-17
  • 打赏
  • 举报
回复
函数中不能操作数据表(insert , update , delete ...),但可以操作表变量。

22,209

社区成员

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

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