2014-08-30 66 views
10

我想補充的SqlServer中的連接字符串,一些東西自定義屬性是這樣的:如何將自定義屬性添加到SQL連接字符串?

Integrated Security=SSPI;Extended Properties="SomeAttr=SomeValue";Persist Security Info=False;Initial Catalog=DB;Data Source=SERVER 

,然後讓在SQL中的屬性。例如SELECT SOME_FUNCTION('SomeAttr')

回答

16

沒有通過客戶端API傳遞自定義連接字符串屬性的通用方法,並使用T-SQL進行檢索。不過,你有很多選擇。以下是一些。

方法1:使用連接字符串中的應用程序名的關鍵字來傳遞最多128個字符,並與APP_NAME檢索()T-SQL函數:

Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=DB;Data Source=SERVER;Application Name="SomeAttr=SomeValue" 

SELECT APP_NAME(); 

注意,這是有限的,以128字符,你將需要解析有效載荷。另外,由於ADO.NET爲每個不同的連接字符串創建一個單獨的連接池,因此可以認爲實際上只有很少或沒有數據庫連接池。

方法2:執行一組CONTEXT_INFO連接並分配多達128個字節可以與CONTEXT_INFO)T-SQL函數retreived後:

DECLARE @context_info varbinary(128) = CAST('SomeAttr=SomeValue' AS varbinary(128)); 
SET CONTEXT_INFO @context_info; 

SELECT CAST(CONTEXT_INFO() AS varchar(128)); 

注意,這是限制爲128個字節和你將需要解析有效載荷。

方法3:創建後,會話級臨時表接插可以用一個SELECT查詢檢索名稱/值對:

CREATE TABLE #CustomSessionAttributes(
     AttributeName varchar(128) PRIMARY KEY 
    , AttributeValue varchar(1000)); 
INSERT INTO #CustomSessionAttributes VALUES('SomeAttr', 'SomeValue'); 

SELECT AttributeValue 
FROM #CustomSessionAttributes 
WHERE AttributeName = 'SomeAttr'; 

注意,你可以增加屬性值的大小和根據需要鍵入,不需要解析。

方法4:創建的會話ID鍵入一個永久表和屬性名,插入名稱/值對連接後,可以用一個SELECT查詢檢索:

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

請注意,您可以增加屬性值大小和類型,不需要解析。

編輯:

方法5:使用存儲過程sp_set_session_context存儲會話範圍的名稱/值對,並與SESSION_CONTEXT()功能檢索值。此功能是在SQL Server 2016和Azure SQL數據庫中引入的。

EXEC sp_set_session_context 'SomeAttr', 'SomeValue'; 
SELECT SESSION_CONTEXT(N'SomeAttr'); 
相關問題