"Doğrudan SQL çalıştırılıyor;

2 Cevap php

Orada bu hata ile ilgili google çok değildi, bu yüzden ben burada soruyorum. Ben (php_mssql değil, ODBC kullanarak) SQL Server 2008 için MySQL kullanarak bir PHP web uygulaması geçiyorum. Sorguları veya başka bir şey çalıştıran bir sorun değil, ama ben SCOPE_IDENTITY (ya da herhangi benzer işlevleri) yapmaya çalıştığınızda, ben hata alıyorum "doğrudan SQL çalıştırılıyor; hiçbir imleç". Ben hemen bir ekleme yapıyorum, bu yüzden hala kapsamında olmalıdır. Insert ID, SQL Server Management Studio çalışıyor için aynı insert deyimi çalıştırdıktan sonra sorgulayabilirsiniz. İşte benim kod (veritabanı sarıcı sınıfta başka her şeyi diğer sorguları için çalışıyor, bu yüzden şu anda uygun değil kabul edeceğiz) şu anda var:

function insert_id(){
    return $this->query_first("SELECT SCOPE_IDENTITY() as insert_id");
}

query_first bir sorgunun ilk alanından ilk sonuç döndüren bir fonksiyonu olduğu (üzerine execute_scalar temelde eşdeğer (). net).

The full error message: Warning: odbc_exec() [function.odbc-exec]: SQL error: [Microsoft][SQL Server Native Client 10.0][SQL Server]Executing SQL directly; no cursor., SQL state 01000 in SQLExecDirect in C:[...]\Database_MSSQL.php on line 110

2 Cevap

Eğer etrafında bir çalışma olarak OUTPUT yan tümce kullanarak deneyebilirsiniz:

INSERT INTO YourTable
        (col1, col2, col3)
        OUTPUT INSERTED.YourIdentityCol as insert_id
    VALUES (val1, val2, val3)

Bu tek bir açıklama satırı eklemek ve kimlik değerlerinin bir sonuç kümesi döndürür.

çalışma örneği:

create table YourTestTable (RowID int identity(1,1), RowValue varchar(10))
go

INSERT INTO YourTestTable
        (RowValue)
        OUTPUT INSERTED.RowID as insert_id
    VALUES
        ('abcd')

ÇIKIŞ:

insert_id
-----------
1

(1 row(s) affected)

Bir defada birden çok satır ekleyebilir, bu da iyidir:

INSERT INTO YourTestTable
        (RowValue)
        OUTPUT INSERTED.RowID as insert_id
    SELECT 'abcd'
    UNION SELECT '1234'
    UNION SELECT 'xyz'

ÇIKIŞ:

insert_id
-----------
2
3
4

(3 row(s) affected)

Ben () yalnızca aynı spıd'nin yani bu oturum için son kimlik değerini dönecektir gerçek ekleme deyimini ama SCOPE_IDENTITY yürütme nasıl emin değilim.

Eğer DB bağlanmak ve ekleme gerçekleştirmek ve sonra SCOPE_IDENTITY tekrar DB bağlanmak, onlar iki farklı oturumlarda olduğu gibi () her zaman null dönecektir.