这是我创建的函数:create function Fun_NewCarOnLineAllAccount
(
@ServerName varchar(100),
@TerminalSN varchar(100),
@ServerCardNum varchar(20),
@endDate datetime,
@starDate datetime
)
returns table
as
return(select Brand,Name,ServiceNo,sum(s) as Second,COUNT(*) as Acount,TerminalSN
from
(select ServiceNo,b.TerminalSN,Name,c.Brand,
(case
when states=0 then DATEDIFF(SECOND,LoginIn,LoginOut) end
) as s from TaxiRdDriverLogin b
inner join TR_Car c on b.TerminalSN=c.TerminalSN and c.Isdelete=0
where(@TerminalSN = '' or b.TerminalSN in (@TerminalSN))
and(@ServerName='' or b.ServiceNo in (@ServerName))
and (@ServerCardNum = '' or b.ServiceNo like '%'+ @ServerCardNum +'%')
and ((LoginIn<@endDate and LoginIn>@starDate) or LoginOut is null)
) a group by ServiceNo,TerminalSN,Name,Brand)
我用的时候select * from Fun_NewCarOnLineAllAccount('','086,731','','','')这样查不出数据来。
你可以修改为动态sql,否则是不会自动拆分为两个数据的~,虽然你的函数的表值,不过参数是标量~
不懂。什么是动态sql?应该怎么写?
@camille繁花: declare @sql varchar(2000) set @sql='select * from t where col in ('+@参数+')'
exec(@sql)
这种算动态sql~
你把参数拆开来传 或者你把函数定义一个参数 到里面再分开。
函数已经定义参数了啊。你说的应该怎么分?
@camille繁花: 刚开始没有看清楚参数。
问题可能是在and ((LoginIn<@endDate and LoginIn>@starDate) or LoginOut is null)这个地方。
因为你传进来的('','086,731','','','') 这个地方最后二个日期是空的。
在比较时 空日期是比有日期值的要小。 所以这个地方如果没有LoginOut is null的数据存在。就查不到值了。
问题出在 b.TerminalSN in (@TerminalSN)
那我应该怎么写呢?我之前用的方法是像and (@ServerCardNum = '' or b.ServiceNo like '%'+ @ServerCardNum +'%')这样的like。页面上用数组一个一个循环的 好麻烦 想改函数不写循环
@camille繁花:
可以使用EXEC('')进行SQL语句的拼接
@dudu: 不是很懂,您能详细一点么...
@dudu
b.TerminalSN in (@TerminalSN) 这样写法是可以的,应该没有错。
我在MSSQL中是能运行的。