Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

mssql XML-funktion virker ikke via php->pdo

2 views
Skip to first unread message

Leif Neland

unread,
Apr 18, 2013, 9:34:22 AM4/18/13
to
Jeg har lavet denne funktion:

CREATE FUNCTION [dbo].SplitToInt
(
@sep VARCHAR(32),
@s VARCHAR(MAX)
)
RETURNS
@result TABLE (
Id INT NULL
)
AS
BEGIN
DECLARE @xml XML
SET @XML = N'<root><r>' + REPLACE(@s, @sep, '</r><r>') +
'</r></root>'

INSERT INTO @result(Id)
SELECT DISTINCT r.value('.','int') as Item
FROM @xml.nodes('//root//r') AS RECORDS(r)

RETURN
END

Taget fra http://stackoverflow.com/a/9714484/1678652

Den kaldes f.ex. som select * from dbo.SplitToInt(' ','1 2 4')

Den fungerer i SSMS og returnerer en tabel med rᅵkkerne 1,2 og 4.

Men kalder jeg den fra php->pdo, fᅵr jeg et tomt svar, ingen
fejlmeddelelser.

Funktionen bliver kaldt: prᅵver jeg med et forkert funktionsnavn fᅵs
fejl.
Den fᅵr de rigtige parametre: hardcoder jeg dem i funktionen,
returneres stadig intet, men det hardcodede svar returneres i SSMS.

Bruger jeg ikke XML, men hardcodet resultat, returneres det i php:
INSERT INTO @result(Id)
-- SELECT DISTINCT r.value('.','int') as Item
-- FROM @xml.nodes('//root//r') AS RECORDS(r)
SELECT 42

RETURN

Skriver php nok sᅵ fint:
Array
(
[0] => Array
(
[val] => 42
)

)

Mangler php-brugeren nogle rettigheder? Der er fulde rettigheder til
funktionen.

Kan det have noget med dette at gᅵre?

http://beingoyen.blogspot.dk/2009/06/tsql-error-execute-permission-denied-on.html

Solution was simple:
GRANT EXECUTE ON XML SCHEMA COLLECTION::{XMLSchema1} TO
{RestrictedLoginName}

Men jeg har ikke nogen schema'er; i SSMS kan jeg tildele rettigheder
til brugeren, og sᅵge efter objecter af typen "XML Schema collections",
men der er ikke nogen.

Jeg er forvirret...

Leif

--
Husk kᅵrelys bagpᅵ, hvis din bilfabrikant har taget den idiotiske
beslutning at undlade det.


Arne Vajhøj

unread,
Apr 19, 2013, 9:40:33 PM4/19/13
to
Jeg kan godt faa det til at virke her.

Men har du:

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE FUNCTION ...

?

Hvis ikke ANSI_NULLS og QUOTED_IDENTIFIER er ON naar
du definerer function vil du faa en fejl, naar du kalder
function (bruge af XML kraever disse).

Arne


Arne Vajhøj

unread,
Apr 19, 2013, 9:41:51 PM4/19/13
to
Ioevrigt synes jeg ikke at:

string -> XML -> rows

er elegant.

Jeg ville have brugt CLR function loesningen!

Arne


0 new messages