您需要在该实例的根文件夹下的
\Binn文件夹中放置一个
sqlservr.exe.config文件。例如:
C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\Binn
如果您使用的是SQL Server 2008 R2(SP1)或更新版本,则可以通过以下查询找到确切位置,该查询显示了sqlservr.exe的完整路径:
SELECT [filename] FROM sys.dm_server_services WHERE servicename LIKE N'SQL Server (%';
在你的代码中,你需要在顶部加上这一行:
using System.Configuration;
然后这将会工作:
[SqlFunction(DataAccess = DataAccessKind.None, IsDeterministic = true)]
public static SqlString GetConfig(SqlString WhichOne)
{
ConfigurationManager.RefreshSection("connectionStrings");
return ConfigurationManager.ConnectionStrings[WhichOne.Value].ToString();
}
sqlservr.exe.config文件的内容:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<connectionStrings>
<add name="Stuff" connectionString="Trusted_Connection=true; Enlist=false;" />
<add name="ClrTest" connectionString="boo hoo" />
</connectionStrings>
</configuration>
需要注意的是,如“使用应用程序配置…”链接中所述,对配置文件所做的更改不会立即生效。但是,您无需通过在该文章中提到的方法之一(即DBCC FREESYSTEMCACHE
和重新启动SQL Server)强制重新加载。要获取当前信息所需的全部内容只是通过像上面示例中显示的ConfigurationManager.RefreshSection(string sectionName)重新加载您正在使用的特定部分即可。请参见下面有关用法和性能的说明。
资源:
此外,除非你绝对需要,否则不应将程序集创建为UNSAFE
。如果你只是想建立到其他机器的TCP连接,那么只需要EXTERNAL_ACCESS
。
用法和性能
正如Joe B在下面的评论所建议的那样,RefreshSection
操作会有一点性能损失。如果包含刷新的代码会每两分钟调用一次以上,则会有明显的影响(这是由于配置文件变化的频率不高而不必要的)。在这种情况下,您需要从经常被调用的代码中删除对RefreshSection
的调用,并独立处理刷新。
一种方法是创建一个SQLCLR存储过程或标量函数,仅执行刷新操作。每当更改配置文件时,可以执行此操作。
另一种方法是卸载应用程序域,这将在下一次引用该数据库中的任何SQLCLR对象时重新加载配置文件。一个相当简单的方法是重新加载特定数据库中的所有应用程序域(而不是整个实例),即启用然后再次关闭TRUSTWORTHY
设置或关闭然后再次启用,具体取决于该设置的当前状态。以下代码将检查该设置的当前状态并相应地进行更改:
IF (EXISTS(
SELECT sd.*
FROM sys.databases sd
WHERE sd.[name] = DB_NAME()
AND sd.[is_trustworthy_on] = 0
))
BEGIN
PRINT 'Enabling then disabling TRUSTWORTHY...';
ALTER DATABASE CURRENT SET TRUSTWORTHY ON;
ALTER DATABASE CURRENT SET TRUSTWORTHY OFF;
END;
ELSE
BEGIN
PRINT 'Disabling then enabling TRUSTWORTHY...';
ALTER DATABASE CURRENT SET TRUSTWORTHY OFF;
ALTER DATABASE CURRENT SET TRUSTWORTHY ON;
END;
请不要使用任何更激烈的方法,如DBCC FREESYSTEMCACHE
,禁用再启用clr enabled
系统设置,重新启动实例等,因为这几乎从来不是必要的。特别是重新启动实例或DBCC FREESYSTEMCACHE
会删除整个实例的所有缓存数据,这影响的远不止SQLCLR。
关于Linux上的SQL Server的更新
从版本2017开始,SQL Server现在可以在Linux上使用(哇呼!)。然而,似乎在Linux上从应用程序配置文件中读取不起作用。我已经尝试了许多组合,例如sqlservr.exe.[Cc]onfig
和sqlservr.[Cc]onfig
等,并没有得到任何结果。指定配置文件是无法工作的,因为这需要EXTERNAL_ACCESS
权限,而目前只允许在Linux上使用SAFE
程序集(至少目前是这样的)。如果我找到了解决方法,我会在这里发布详细信息。
sqlservr.exe
可执行文件匹配。我相信你可以有一个appSettings
部分,但是当我尝试提取特定键的值时出现了错误。另一方面,我成功地读取了connectionStrings
部分而没有遇到问题。你可以尝试两种方法,但我目前只能证明其中一种绝对有效。 - Solomon RutzkyUNSAFE
,请看我在这里的建议:http://stackoverflow.com/questions/28179038/can-i-store-information-in-a-static-variable-in-a-sql-server-clr-assembly-withou/28179162#28179162 或许对你有帮助,值得一试。 - Solomon RutzkyDBCC FREEYSTEMCACHE
通常是一个不好的选择。 - Solomon Rutzky