我想在 SqlServer 连接字符串中添加一些自定义属性,如下所示:
Integrated Security=SSPI;Extended Properties="SomeAttr=SomeValue";Persist Security Info=False;Initial Catalog=DB;Data Source=SERVER
然后在sql中获取该属性。例如SELECT SOME_FUNCTION('SomeAttr')
我想在 SqlServer 连接字符串中添加一些自定义属性,如下所示:
Integrated Security=SSPI;Extended Properties="SomeAttr=SomeValue";Persist Security Info=False;Initial Catalog=DB;Data Source=SERVER
然后在sql中获取该属性。例如SELECT SOME_FUNCTION('SomeAttr')
没有通用的方法可以通过客户端 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:连接后执行 SET CONTEXT_INFO 并分配最多 128 个字节,可以使用 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));
请注意,这限制为 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');
您可以在连接字符串中使用 WSID 和 APP 关键字。您可以使用 HOST_NAME() 和 APP_NAME() 函数读取这些值。有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/ms130822.aspx。