devotionMedlem sedan jan. 20013 582 inlägg Hej,
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)
Kör jag endast funktionen enligt:
select * from dbo.func_split('HL;MN;JN')
Så returnerar den:
Sign
----
HL
MN
JN
Någon som har någon bra idé
Mvh
Henrik
:)
@ndersMedlem sedan juni 200032 969 inlägg På vilket sätt funkar det inte då?
devotionMedlem sedan jan. 20013 582 inlägg Jag får felmeddelande enligt:
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'.
Mvh
Henrik
Peter SMedlem sedan dec. 20025 483 inlägg Hm, blir det någon skillnad med
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' )
devotionMedlem sedan jan. 20013 582 inlägg Nä.... :(
Server: Msg 170, Level 15, State 1, Line 7
Line 7: Incorrect syntax near 'tblTask'.
Jag begriper inte varför...
//Henrik
devotionMedlem sedan jan. 20013 582 inlägg 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'
Inga fler idéer?
:)
Mvh
Henrik
Peter SMedlem sedan dec. 20025 483 inlägg 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.
devotionMedlem sedan jan. 20013 582 inlägg
Peter S skrev:
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.
Men, varför funkar det i SQL 2005? :)
Mvh
Henrik
Peter SMedlem sedan dec. 20025 483 inlägg Min första mening avser det fall där du körde enbart subselecten. Min andra mening var nog mer generellt :)
devotionMedlem sedan jan. 20013 582 inlägg
Fredde Mannen skrev:
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.
Tex
2009-03-08 00:00:00.000 0.0 HERY
2009-04-06 10:54:41.000 0.0 HERY
2009-02-02 10:00:00.000 0.0 ALHO
2009-02-02 13:00:00.000 0.0 ALHO
Dessa ingår inte i ovan nämnda arbetsgrupp...
Mvh
Henrik
Peter SMedlem sedan dec. 20025 483 inlägg Det är för att du använder ett statiskt värde (STJO) istället för tblTask.UserSign, så det är inte konstigt.
devotionMedlem sedan jan. 20013 582 inlägg
Peter S skrev:
Det är för att du använder ett statiskt värde (STJO) istället för tblTask.UserSign, så det är inte konstigt.
Det konstiga, är att det inte fungerar i 2000.... :)
Peter SMedlem sedan dec. 20025 483 inlägg Enligt http://www.dbforums.com/microsoft-sql-server/999192-multi-statement-table-valued-functions.html#post3682648 fungerar det inte att i SQL2k skicka ett fältnamn som argument. Variabler och statiska värden fungerar däremot.
Peter S skrev:
Enligt http://www.dbforums.com/microsoft-sql-server/999192-multi-statement-table-valued-functions.html#post3682648 fungerar det inte att i SQL2k skicka ett fältnamn som argument. Variabler och statiska värden fungerar däremot.
Det var dit jag var påväg.. :)
devotionMedlem sedan jan. 20013 582 inlägg
Peter S skrev:
Enligt http://www.dbforums.com/microsoft-sql-server/999192-multi-statement-table-valued-functions.html#post3682648 fungerar det inte att i SQL2k skicka ett fältnamn som argument. Variabler och statiska värden fungerar däremot.
Hmmm, då är det kört, med 2000....
Bra att veta ialla fall!
:)
Mvh
Henrik