2011-10-12 31 views
67

Tôi muốn khai báo một biến trong sqlite và sử dụng nó trong hoạt động chènKhai báo biến trong sqlite và sử dụng nó

như trong MS SQL

Declare @name as varchar(10) 

set name = 'name' 

Select * from table where name = @name 

Ví dụ, tôi sẽ cần phải nhận được last_insert_row và sử dụng nó trong chèn

tôi đã tìm thấy một cái gì đó về ràng buộc nhưng tôi đã không thực sự hoàn toàn hiểu nó

+6

sqlite không hỗ trợ điều này. –

Trả lời

68

SQLite không hỗ trợ cú pháp biến gốc, nhưng bạn có thể đạt được hầu như giống nhau bằng bảng tạm thời trong bộ nhớ.

Tôi đã sử dụng cách tiếp cận dưới đây cho các dự án lớn và hoạt động như một sự quyến rũ.

/* 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; 
+0

Các dấu ngoặc [] này được sử dụng để làm gì? – WindRider

+1

@WindRider: để tránh bất kỳ xung đột nào với các từ dành riêng. Một thói quen của tôi nhưng không cần thiết trong trường hợp này, vì vậy họ đang loại bỏ. –

+0

Điều này làm việc nhưng có một vài nhận xét, tôi đã thử điều này trên spatialite, và ở đó nó nói rằng bạn không thể thay đổi các cửa hàng tạm thời từ bên trong một giao dịch. Ngoài ra, tôi nghĩ bạn đang thiếu dấu chấm phẩy sau khi BEGIN. Tx để chia sẻ giải pháp này. –

1

Hãy thử sử dụng các giá trị ràng buộc. Bạn không thể sử dụng các biến như bạn làm trong T-SQL nhưng bạn có thể sử dụng "tham số". Tôi hy vọng các liên kết sau là hữu ích. Binding Values

+18

bạn có thể làm cho câu trả lời của bạn cung cấp các ví dụ phong phú hơn. Các liên kết có thể được di chuyển nhưng các ví dụ của bạn sẽ ở đây để tham khảo trong tương lai. – Pabluez

34

Giải pháp của Herman có thể được đơn giản hóa vì Sqlite cho phép lưu trữ bất kỳ loại giá trị nào trên bất kỳ trường nào.

Đây là một phiên bản đơn giản có sử dụng một Value lĩnh vực khai báo là TEXT để lưu trữ bất kỳ giá trị:

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'; 
5

giải pháp Herman của làm việc cho tôi, nhưng ... đã cho tôi lẫn lộn một chút. Tôi bao gồm bản demo tôi đã làm việc dựa trên câu trả lời của anh ấy. Các tính năng bổ sung trong câu trả lời của tôi bao gồm hỗ trợ khóa ngoài, phím tăng tự động và sử dụng hàm last_insert_rowid() để nhận khóa được tạo tự động cuối cùng trong giao dịch.

Nhu cầu của tôi về thông tin này xuất hiện khi tôi nhấn một giao dịch yêu cầu ba khóa ngoại nhưng tôi chỉ có thể nhận được thông báo cuối cùng với 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; 
Các vấn đề liên quan