我是想所有根据程序指定的传入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 行
'.' 附近有语法错误。
为什么不是直接in(1,2,3,4)?
是个参数 我要用到触发器里面的
试试
exec ‘select * from tbuser where User_ID in (‘+dbo.f_splitstr('1,2,3,4',',')+’)’
我要用到触发器里面的
应该是这样写的吧:select * from tbuser where User_ID in (select * from dbo.f_splitstr('1,2,3,4',','))
哎呀,不要太刻板了,你把函数定义成接受 三个参数,f_inseparatedstr(...), 三个参数分别传进 User_ID, '1,2,3,4', ',', 不就可以了,返回值可以是bit , 能不能找到用0,1表示。
你没看懂我要的是什么
@koi: 不好意思,没仔细看,但是我觉得也是个方法,如果你不那么...
@koi: 不好意思,就当我没发言过。
你的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',',') 来使用
单独这一句是没错 但是放都触发器里就显示我说的错误了
这样写 m.Media_ID in (select dbo.f_splitstr(i.Monitor_MediaID_Group,',')) 放到触发器到还可以 执行成功 不过通过程序访问的话又会报一样的错误
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 行
'.' 附近有语法错误。
@koi:
我你换成 m.Media_ID in (SELECT * FROM dbo.f_splitstr(i.Monitor_MediaID_Group,',')) 试下
@人来人往: 你这句跟我的不一样的吗 ? 试过了 不可以
@koi: 照你这样说的话,你可以朝着这个函数的权限的方向去考虑。
@jingjunfeng: 权限是对的
@koi:
不知你用哪个版本的数据库,我用自己的2008数据库简单测试了下,放在触发器里也是可行的
看你提示是个语法错误不通过,SELECT * 是返回所有列,IN 语句只能作用在一个列,
f_splitstr函数会返回一个带列名的表,你指定列名,不用 SELECT * 试下 SELECT Cname FROM
以上也只是猜测。
@koi: 可以检测下返回来的值?是否与函数传递进的要进行处理的参数值,是否一致。
@人来人往: 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 行
'.' 附近有语法错误。
应该是传参出了问题吧
(select dbo.f_splitstr(i.Monitor_MediaID_Group,','))
后面的逗号参数
估计是被函数理解为传三个参数了
可以用变量,先给变量赋值,然后传递进去。
话说 是不支持动态sql。。