PHP: MSSQL en SELECT * FROM @temptable";

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Jack Sanderse

Jack Sanderse

18/02/2021 10:49:50
Quote Anchor link
Van een via INSERT geschreven nieuw record in een MSSQL tabel wil ik de ID opvragen. Dat kan met SCOPE IDENTITY, maar dat wordt afgeraden en werkt ook niet met geparametriseerde query-statements.
Nu vond ik deze code:
$query = "DECLARE @temptable TABLE ([CreatedID] int, [item2] varchar(50))
INSERT INTO test (item2)
OUTPUT INSERTED.[id], INSERTED.[item2] INTO @temptable
VALUES ('abc5')
SELECT * FROM @temptable";

Eerst maar een een simpele test uitgevoerd (nog niet geparametriseerd).
Op zich werkt de code, alleen kan ik er niet achter komen hoe ik in php het resultaat van de SELECT clausule te pakken kan krijgen.
Wie kan mij helpen?
bvd, Jack
 
PHP hulp

PHP hulp

02/02/2023 03:29:46
 
- Ariën  -
Beheerder

- Ariën -

18/02/2021 10:52:51
Quote Anchor link
Een kwestie van in MSSQL de queries uitvoeren, en deze te fetchen?
 
Frank Nietbelangrijk

Frank Nietbelangrijk

18/02/2021 16:03:12
Quote Anchor link
Doe je de insert met PHP? Welke functie gebruik je daarvoor?
 
Jack Sanderse

Jack Sanderse

18/02/2021 16:45:29
Quote Anchor link
Dank voor jullie reacties.

Dit is mijn code-voorbeeld:

$conn = sqlsrv_connect($dbhost,$connectionInfo);
if( $conn === false )
{ die( print_r( sqlsrv_errors(), true)); }

$query = "DECLARE @temptable TABLE ([CreatedID] int)
INSERT INTO test (item2)
OUTPUT INSERTED.[id] INTO @temptable
VALUES (?)
SELECT * FROM @temptable";

$params = array("abcde12");

$result = sqlsrv_query($conn, $query, $params, $options);
if( $result === false )
{ die( print_r( sqlsrv_errors(), true)); }

De insert in tabel test2 werkt, dus de uitvoering gaat goed.
Ik probeerde een fetch:
if( sqlsrv_fetch( $result ) === false)
{ die( print_r( sqlsrv_errors(), true));
Maar dat leverde alleen melding op dat er geen waarden werden opgeleverd.

Wat ik nu doe is gewoon de insert (zonder de temptable) en meteen daarna een nieuwe query met een SELECT om de hoogste ID in tabel test2 op te vragen. Werkt goed (3 milliseconden) en het is vrijwel uitgesloten dat iemand anders in die tijd een insert doet in diezelfde tabel, maar het netste is natuurlijk om het in één query te doen met die temptable.

Toevoeging op 18/02/2021 16:48:53:

Na die laatste
{ die( print_r( sqlsrv_errors(), true));
moet natuurlijk nog wel een } maar die stond er in de echte code wel :-)
 
Frank Nietbelangrijk

Frank Nietbelangrijk

18/02/2021 17:05:14
Quote Anchor link
Ik heb niet echt veel ervaring met MS SQL maar met MySQL zou je een functie mysqli_insert_id() gebruiken om het nieuw aangemaakte ID op te halen. Volgens dit draadje op Stack Overflow kan dat met MS SQL met de query
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
SELECT SCOPE_IDENTITY()


Daarnaast kun je met Transactions werken om zeker te zijn dat beiden queries slagen of indien ze niet slagen beiden queries ongedaan te maken.

Zie hiervoor sqlsrv_begin_transaction, sqlsrv_commit en sqlsrv_rollback (overzicht)
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.