Không có phương pháp tổng quát nào để chuyển các thuộc tính chuỗi kết nối tùy chỉnh qua API ứng dụng khách và truy xuất bằng T-SQL. Tuy nhiên, bạn có một số lựa chọn thay thế. Dưới đây là một số.
Phương pháp 1 :Sử dụng từ khóa Tên ứng dụng trong chuỗi kết nối để chuyển tối đa 128 ký tự và truy xuất bằng hàm APP_NAME () T-SQL:
Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=DB;Data Source=SERVER;Application Name="SomeAttr=SomeValue"
SELECT APP_NAME();
Lưu ý rằng điều này được giới hạn trong 128 ký tự và bạn sẽ cần phải phân tích cú pháp tải trọng. Ngoài ra, vì ADO.NET tạo một nhóm kết nối riêng biệt cho từng chuỗi kết nối riêng biệt, hãy xem xét thực tế sẽ có ít hoặc không có nhóm kết nối cơ sở dữ liệu.
Phương pháp 2 :Thực thi SET CONTEXT_INFO sau khi kết nối và gán tối đa 128 byte có thể được truy xuất bằng hàm CONTEXT_INFO) T-SQL:
DECLARE @context_info varbinary(128) = CAST('SomeAttr=SomeValue' AS varbinary(128));
SET CONTEXT_INFO @context_info;
SELECT CAST(CONTEXT_INFO() AS varchar(128));
Lưu ý rằng điều này được giới hạn ở 128 byte và bạn sẽ cần phải phân tích cú pháp tải trọng.
Phương pháp 3 :Tạo bảng tạm thời cấp phiên sau khi kết nối và chèn các cặp tên / giá trị có thể được truy xuất bằng truy vấn CHỌN:
CREATE TABLE #CustomSessionAttributes(
AttributeName varchar(128) PRIMARY KEY
, AttributeValue varchar(1000));
INSERT INTO #CustomSessionAttributes VALUES('SomeAttr', 'SomeValue');
SELECT AttributeValue
FROM #CustomSessionAttributes
WHERE AttributeName = 'SomeAttr';
Lưu ý rằng bạn có thể tăng kích thước và loại giá trị thuộc tính nếu cần và không cần phân tích cú pháp.
Phương pháp 4 :Tạo một bảng vĩnh viễn được khóa bằng id phiên và tên thuộc tính, chèn các cặp tên / giá trị sau khi kết nối có thể được truy xuất bằng truy vấn CHỌN:
CREATE TABLE dbo.CustomSessionAttributes(
SessionID smallint
, AttributeName varchar(128)
, AttributeValue varchar(1000)
, CONSTRAINT PK_CustomSessionAttributes PRIMARY KEY (SessionID, AttributeName)
);
--clean up previous session
DELETE FROM dbo.CustomSessionAttributes WHERE SessionID = @@SPID;
--insert values for this session
INSERT INTO dbo.CustomSessionAttributes VALUES(@@SPID, 'SomeAttr', 'SomeValue');
--retreive attribute value
SELECT AttributeValue
FROM dbo.CustomSessionAttributes
WHERE
SessionID = @@SPID
AND AttributeName = 'SomeAttr';
Lưu ý rằng bạn có thể tăng kích thước và loại giá trị thuộc tính nếu cần và không cần phân tích cú pháp.
CHỈNH SỬA:
Phương pháp 5 :Sử dụng thủ tục đã lưu trữ sp_set_session_context để lưu trữ các cặp tên / giá trị trong phạm vi phiên và truy xuất các giá trị bằng hàm SESSION_CONTEXT (). Tính năng này đã được giới thiệu trong SQL Server 2016 và Azure SQL Database.
EXEC sp_set_session_context 'SomeAttr', 'SomeValue';
SELECT SESSION_CONTEXT(N'SomeAttr');