首页新闻找找看学习计划

asp.net 数据库

0
悬赏园豆:80 [已关闭问题] 关闭于 2012-03-09 14:22

我是想所有根据程序指定的传入sql server 里的一串 用户id 取出用户信息 比如id是 “1,2,3,4”

然后我自己写了个函数f_splitstr,f_splitstr的作用就是和c# 的Split()方法是一样的 但是的出来的结果好像不能应用于下面的sql语句

select * from tbuser where User_ID in (dbo.f_splitstr('1,2,3,4',','))

报错

消息 4121,级别 16,状态 1,第 1 行
找不到列 "dbo" 或用户定义的函数或聚合 "dbo.f_splitstr",或者名称不明确。

 

有哪位可以帮帮忙看怎么改才可以

问题补充:

 f_split 是一个我sql函数名, select val from dbo.f_split('1,2,3,4,5,6',',') 可以得到一组按逗号(,)分割的一列数据, 但是放到触发器 如下

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go

ALTER TRIGGER [TR_Update_Monitor] 
ON [dbo].[tbMonitor]
FOR UPDATE
AS
BEGIN
UPDATE tbMedia
SET Media_Monitoring = 'False'
FROM tbMedia,Inserted i,Deleted d
where Media_ID in (select val from dbo.f_split(i.Monitor_MediaID_Group,',')) and (i.Monitor_Stat = 1 or i.Monitor_Stat = 2)

end

放到触发器里面吧'1,2,3,4,5,6' 换成i.Monitor_MediaID_Group 变量就分析都通不过了

消息 102,级别 15,状态 1,过程 TR_Update_Monitor,第 10 行
'.' 附近有语法错误。

koi的主页 koi | 初学一级 | 园豆:3
提问于:2012-03-04 20:21
< >
分享
所有回答(7)
0

为什么不是直接in(1,2,3,4)?

I,Robot | 园豆:9461 (大侠五级) | 2012-03-04 20:32

是个参数 我要用到触发器里面的 

支持(0) 反对(0) koi | 园豆:3 (初学一级) | 2012-03-04 20:33
0

试试

exec ‘select * from tbuser where User_ID in (‘+dbo.f_splitstr('1,2,3,4',',')+’)

死白的man | 园豆:2135 (老鸟四级) | 2012-03-04 20:33

我要用到触发器里面的 

支持(0) 反对(0) koi | 园豆:3 (初学一级) | 2012-03-04 20:34
0

应该是这样写的吧:select * from tbuser where User_ID in (select * from dbo.f_splitstr('1,2,3,4',','))

--宁静以致远-- | 园豆:364 (菜鸟二级) | 2012-03-04 23:06
0

哎呀,不要太刻板了,你把函数定义成接受 三个参数,f_inseparatedstr(...), 三个参数分别传进 User_ID, '1,2,3,4', ',', 不就可以了,返回值可以是bit , 能不能找到用0,1表示。

ChatinCode | 园豆:2272 (老鸟四级) | 2012-03-05 09:54

你没看懂我要的是什么

支持(0) 反对(0) koi | 园豆:3 (初学一级) | 2012-03-05 09:56

@koi: 不好意思,没仔细看,但是我觉得也是个方法,如果你不那么...

支持(0) 反对(0) ChatinCode | 园豆:2272 (老鸟四级) | 2012-03-05 12:47

@koi: 不好意思,就当我没发言过。

支持(0) 反对(0) ChatinCode | 园豆:2272 (老鸟四级) | 2012-03-05 12:54
0

你的f_splitstr 函数应该是个 表值函数 ,返回的是张表

改成 select * from tbuser where User_ID in (SELECT * FROM dbo.f_splitstr('1,2,3,4',',')) 

应该就行了,我试过可以的 

 

如果:f_splitstr 是个标量值函数 ,可以直接  SELECT  dbo.f_splitstr('1,2,3,4',',') 来使用 

人来人往 | 园豆:255 (菜鸟二级) | 2012-03-05 10:31

单独这一句是没错 但是放都触发器里就显示我说的错误了

  这样写 m.Media_ID in (select dbo.f_splitstr(i.Monitor_MediaID_Group,','))  放到触发器到还可以  执行成功 不过通过程序访问的话又会报一样的错误

支持(0) 反对(0) koi | 园豆:3 (初学一级) | 2012-03-05 10:34

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go


ALTER TRIGGER [TR_Update_Monitor]
ON [dbo].[tbMonitor]
FOR UPDATE
AS
BEGIN
UPDATE tbMedia
SET Media_Monitoring = 'False'
FROM tbMedia m,Inserted i
where m.Media_ID in (select * from dbo.f_splitstr(i.Monitor_MediaID_Group,',')) and (i.Monitor_Stat = 1 or i.Monitor_Stat = 2)
end

 

消息 102,级别 15,状态 1,过程 TR_Update_Monitor,第 11 行
'.' 附近有语法错误。

支持(0) 反对(0) koi | 园豆:3 (初学一级) | 2012-03-05 10:35

@koi: 

我你换成 m.Media_ID in (SELECT * FROM dbo.f_splitstr(i.Monitor_MediaID_Group,','))  试下

支持(0) 反对(0) 人来人往 | 园豆:255 (菜鸟二级) | 2012-03-05 10:41

@人来人往: 你这句跟我的不一样的吗 ?  试过了  不可以

支持(0) 反对(0) koi | 园豆:3 (初学一级) | 2012-03-05 10:51

@koi: 照你这样说的话,你可以朝着这个函数的权限的方向去考虑。

支持(0) 反对(0) jingjunfeng | 园豆:873 (小虾三级) | 2012-03-05 11:13

@jingjunfeng: 权限是对的

支持(0) 反对(0) koi | 园豆:3 (初学一级) | 2012-03-05 11:25

@koi: 

不知你用哪个版本的数据库,我用自己的2008数据库简单测试了下,放在触发器里也是可行的

看你提示是个语法错误不通过,SELECT * 是返回所有列,IN 语句只能作用在一个列,

f_splitstr函数会返回一个带列名的表,你指定列名,不用 SELECT * 试下 SELECT Cname FROM 

以上也只是猜测。

支持(0) 反对(0) 人来人往 | 园豆:255 (菜鸟二级) | 2012-03-05 11:39

@koi: 可以检测下返回来的值?是否与函数传递进的要进行处理的参数值,是否一致。

支持(0) 反对(0) --宁静以致远-- | 园豆:364 (菜鸟二级) | 2012-03-05 11:46

@人来人往: select val from dbo.f_split('1.2.3.4.5.6',',') 可以很好的得到一列值

然后

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go

ALTER TRIGGER [TR_Update_Monitor]
ON [dbo].[tbMonitor]
FOR UPDATE
AS
BEGIN
UPDATE tbMedia
SET Media_Monitoring = 'False'
FROM tbMedia,Inserted i,Deleted d
where Media_ID in (select val from dbo.f_split(i.Monitor_MediaID_Group,',')) and (i.Monitor_Stat = 1 or i.Monitor_Stat = 2)

end

放到触发器里面吧'1.2.3.4.5.6' 换成i.Monitor_MediaID_Group 变量就分析都通不过了

消息 102,级别 15,状态 1,过程 TR_Update_Monitor,第 10 行
'.' 附近有语法错误。

支持(0) 反对(0) koi | 园豆:3 (初学一级) | 2012-03-08 11:17
0

应该是传参出了问题吧

(select dbo.f_splitstr(i.Monitor_MediaID_Group,','))

后面的逗号参数

估计是被函数理解为传三个参数了

可以用变量,先给变量赋值,然后传递进去。

OOLi | 园豆:163 (初学一级) | 2012-03-05 12:01
0

话说 是不支持动态sql。。

koi | 园豆:3 (初学一级) | 2012-03-09 14:21
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册