Jag har följande fina funktion som splittar upp kommaseparerade värden i ett fält enligt:
CREATE FUNCTION dbo.func_split
(
@sign varchar(255)
)
RETURNS @t TABLE (
sign varchar(255))
AS
BEGIN
declare @pos int
declare @tmp varchar(255)
if right(@sign, 1) <> ';'
select @sign = @sign + ';'
select @pos = PATINDEX('%;%', @sign)
while @pos <> 0
begin
select @tmp = left(@sign, @pos - 1)
select @sign = stuff(@sign, 1, @pos, '')
select @pos = PATINDEX('%;%', @sign)
insert @t (sign)
select @tmp
end
RETURN
END
Följande urvalsfråga fungerar finfint i SQL-server 2005, men inte i SQL-Server 2000
SELECT * FROM tblTask WHERE
[Status]=4
AND [tblTask].[Sign1By] <>''
AND [tblTask].[Sign2By] =''
AND EXISTS
(select 1
from func_split([tblTask].[UserSign]) t
INNER JOIN ( SELECT [tblUsers].[Sign] FROM [tblUsers],[tblWorkgroups]
WHERE [tblUsers].[GroupId]=[tblWorkgroups].[Id] AND [tblWorkgroups].[Name]='Service' ) s
on t.sign = s.sign)
Server: Msg 170, Level 15, State 1, Line 7
Line 7: Incorrect syntax near 'tblTask'.
Server: Msg 170, Level 15, State 1, Line 9
Line 9: Incorrect syntax near 's'.
SELECT * FROM tblTask WHERE
[Status]=4
AND [tblTask].[Sign1By] <>''
AND [tblTask].[Sign2By] =''
AND EXISTS
(select 1
from func_split([tblTask].[UserSign]) t
INNER JOIN tblusers u on t.sign = u.sign
inner join tblworkgroups g on u.groupid = g.id
where g.name = 'service' )
Jag testade även att bara köra subqueryn, men med samma resultat:
select 1
from func_split([tblTask].[UserSign]) t
INNER JOIN tblusers u on t.sign = u.sign
inner join tblworkgroups g on u.groupid = g.id
where g.name = 'service'
Det är för att tblTask inte länkas in någonstans (den vet alltså inte vad det är för någonting). Vi skulle behöva ha ett alias för tblTask i den första SELECTen.
Det är för att tblTask inte länkas in någonstans (den vet alltså inte vad det är för någonting). Vi skulle behöva ha ett alias för tblTask i den första SELECTen.
kanske är ute och cyklar.. men om du skulle plocka ut några usersigns som uppfyller kraven för att subqueryn skall returnera önskat värde.
Pröva att ersätta [tblTask].[UserSign], med dem. Och se vad som händer.
Hej :)
Om jag gör det, så slipper jag felmeddelandet!
Testade även att ändra:
from func_split([tblTask].[UserSign]) t
Till:
from func_split('[tblTask].[UserSign]') t
Dvs lägga till fnuttar. Då blir det heller inget felmeddelande... :)
Jag testade även:
SELECT * FROM tblTask WHERE
[Status]=4
AND [tblTask].[Sign1By] =''
AND EXISTS
(select 1
from func_split('STJO') t
INNER JOIN ( SELECT [tblUsers].[Sign] FROM [tblUsers],[tblWorkgroups]
WHERE [tblUsers].[GroupId]=[tblWorkgroups].[Id] AND [tblWorkgroups].[Name]='Kyla Helsingborg' ) s
on t.[sign] = s.[sign])
Som inte ger felmeddelande. UserSign STJO, ingår i arbetsgruppen 'Kyla Helsingborg', så det är rätt. Dock så listas poster med andra användarsignaturer.