PHP: MSSQL en SELECT * FROM @temptable";
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
Een kwestie van in MSSQL de queries uitvoeren, en deze te fetchen?
Doe je de insert met PHP? Welke functie gebruik je daarvoor?
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 :-)
dit draadje op Stack Overflow kan dat met MS SQL met de query
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)
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 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)