Dichiarare la variabile in sqlite e usarla

Voglio dichiarare una variabile in sqlite e usarla nell’operazione di inserimento

come in MS SQL

Declare @name as varchar(10) set name = 'name' Select * from table where name = @name 

Ad esempio, avrò bisogno di ottenere last_insert_row e usarlo in insert

Ho trovato qualcosa sul binding ma non l’ho capito appieno

SQLite non supporta la syntax della variabile nativa, ma è ansible ottenere praticamente lo stesso utilizzando una tabella temporanea in memoria.

Ho usato l’approccio sottostante per i grandi progetti e funziona come un fascino.

  /* Create in-memory temp table for variables */ BEGIN; PRAGMA temp_store = 2; CREATE TEMP TABLE _Variables(Name TEXT PRIMARY KEY, RealValue REAL, IntegerValue INTEGER, BlobValue BLOB, TextValue TEXT); /* Declaring a variable */ INSERT INTO _Variables (Name) VALUES ('VariableName'); /* Assigning a variable (pick the right storage class) */ UPDATE _Variables SET IntegerValue = ... WHERE Name = 'VariableName'; /* Getting variable value (use within expression) */ ... (SELECT coalesce(RealValue, IntegerValue, BlobValue, TextValue) FROM _Variables WHERE Name = 'VariableName' LIMIT 1) ... DROP TABLE _Variables; END; 

La soluzione di Herman funziona, ma può essere semplificata perché Sqlite consente di memorizzare qualsiasi tipo di valore su qualsiasi campo.

Ecco una versione più semplice che utilizza un campo Value dichiarato come TEXT per memorizzare qualsiasi valore:

 CREATE TEMP TABLE IF NOT EXISTS Variables (Name TEXT PRIMARY KEY, Value TEXT); INSERT OR REPLACE INTO Variables VALUES ('VarStr', 'Val1'); INSERT OR REPLACE INTO Variables VALUES ('VarInt', 123); INSERT OR REPLACE INTO Variables VALUES ('VarBlob', x'12345678'); SELECT Value FROM Variables WHERE Name = 'VarStr' UNION ALL SELECT Value FROM Variables WHERE Name = 'VarInt' UNION ALL SELECT Value FROM Variables WHERE Name = 'VarBlob'; 

La soluzione di Herman ha funzionato per me, ma il ... mi ha confuso per un po ‘. Sto includendo la demo che ho elaborato in base alla sua risposta. Le funzionalità aggiuntive nella mia risposta includono il supporto per le chiavi esterne, le chiavi di incremento automatico e l’uso della funzione last_insert_rowid() per ottenere l’ultima chiave generata automaticamente in una transazione.

Il mio bisogno di queste informazioni è venuto fuori quando ho colpito una transazione che richiedeva tre chiavi esterne, ma ho potuto ottenere solo l’ultima con last_insert_rowid() .

 PRAGMA foreign_keys = ON; -- sqlite foreign key support is off by default PRAGMA temp_store = 2; -- store temp table in memory, not on disk CREATE TABLE Foo( Thing1 INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL ); CREATE TABLE Bar( Thing2 INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, FOREIGN KEY(Thing2) REFERENCES Foo(Thing1) ); BEGIN TRANSACTION; CREATE TEMP TABLE _Variables(Key TEXT, Value INTEGER); INSERT INTO Foo(Thing1) VALUES(2); INSERT INTO _Variables(Key, Value) VALUES('FooThing', last_insert_rowid()); INSERT INTO Bar(Thing2) VALUES((SELECT Value FROM _Variables WHERE Key = 'FooThing')); DROP TABLE _Variables; END TRANSACTION; 

Prova a utilizzare i valori di associazione. Non è ansible utilizzare le variabili come si fa in T-SQL ma è ansible utilizzare “parametri”. Spero che il seguente link sia utile. Valori vincolanti