Je veux déclarer une variable dans SQLite et l'utiliser dans l'opération insert
.
Comme dans MS SQL:
declare @name as varchar(10)
set name = 'name'
select * from table where name = @name
Par exemple, je devrai obtenir last_insert_row
et l’utiliser dans insert
.
J'ai trouvé quelque chose à propos de la liaison mais je ne l'ai pas vraiment bien compris.
SQLite ne prend pas en charge la syntaxe de variable native, mais vous pouvez obtenir pratiquement la même chose en utilisant une table temporaire en mémoire.
J'ai utilisé l'approche ci-dessous pour les grands projets et fonctionne à merveille.
/* 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 solution de Herman fonctionne, mais elle peut être simplifiée car Sqlite permet de stocker n'importe quel type de valeur sur n'importe quel champ.
Voici une version plus simple qui utilise un champ Value
déclaré comme TEXT
pour stocker une valeur quelconque:
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 solution de Herman a fonctionné pour moi, mais le ...
M'a un peu mélangé. J'inclus la démo que j'ai préparée en fonction de sa réponse. Les fonctionnalités supplémentaires de ma réponse incluent la prise en charge des clés étrangères, l'incrémentation automatique des clés et l'utilisation de la fonction last_insert_rowid()
pour obtenir la dernière clé générée automatiquement dans une transaction.
Mon besoin de cette information est apparu lorsque j'ai effectué une transaction nécessitant trois clés étrangères, mais je n'ai pu obtenir la dernière qu'avec 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;
Pour les variables en lecture seule (utilisant la même valeur dans toute la requête), utilisez une expression de table commune (CTE).
WITH var AS (SELECT 'name' AS name, 10 AS more)
SELECT *, (table.cost + var.more) AS result
FROM table, var
WHERE table.name = var.name
Essayez d'utiliser des valeurs de liaison. Vous ne pouvez pas utiliser de variables comme dans T-SQL, mais vous pouvez utiliser des "paramètres". J'espère que le lien suivant est utile . Binding Values