我知道在数据库中创建过程时我可以为CLR过程定义默认值,如下所示:
CREATE PROCEDURE [dbo].[ShredXml] (
@InputXml [xml],
@AttributeElementHandling [tinyint] = 0,
@ConversionHandling [tinyint] = 0,
@RootElementName [nvarchar](255) = null
)
AS EXTERNAL NAME [ClrXmlShredder].[ClrXmlShredder].[ShredXml]
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚是否有任何方法可以说服Visual Studio在使用其"部署项目"选项时自动执行此操作...
是否有一个属性可以设置在一个参数上,告诉visual studio当你在数据库中创建proc时,你想要该参数的默认值是什么?
更新:我已经尝试设置可空性"SqlFacet",这似乎没有效果(这有道理我猜 - afaik存储的proc参数总是可以为空?)
[Microsoft.SqlServer.Server.SqlProcedure]
public static void ShredXml(SqlXml InputXml,
[SqlFacet(IsNullable = true)]SqlByte AttributeElementHandling,
[SqlFacet(IsNullable = true)]SqlByte ConversionHandling,
[SqlFacet(MaxSize = 255, IsNullable = true)]string RootElementName
)
{
}
Run Code Online (Sandbox Code Playgroud) sql-server deployment sqlclr visual-studio-2008 sql-server-data-tools
我试图能够使用CLR通过SQL运行.Net DLL - 我这样做是不成功的.
我按照这里的说明操作
所以我正在做以下事情:
CREATE ASYMMETRIC KEY AKEY_SqlClr FROM EXECUTABLE FILE = 'C:\dlls\mySqlClr.dll'
Run Code Online (Sandbox Code Playgroud)
哪个工作正常并创建密钥,然后我尝试执行以下操作:
CREATE LOGIN SQLCLR_AsymKeyLogin FROM ASYMMETRIC KEY AKEY_SqlClr
Run Code Online (Sandbox Code Playgroud)
我收到错误:
找不到非对称密钥'AKEY_SqlClr',因为它不存在或者您没有权限.
我怎么可能没有这个权限?我已经验证我有CREATE LOGIN权限.有任何想法吗?
我有一个问题,我无法解决.我正在使用SQL Server 2005,C#CLR来使用外部dll.问题在于参数的长度.我需要使用函数参数类型varchar(max).如果在C#代码,我使用string,SqlSring我不能使用T-SQL类型varchar(max),刚刚varchar(4000)的nvarchar(4000).我需要说的是,当我需要使用超过4000个符号时,可能会出现这种情况,所以我需要知道,我需要使用哪种C#类型varchar(max).
我已经阅读了很多文章,其中有几篇说,为此,我可以使用SqlChars.但!我有字符串操作.我如何使用string或SqlString然后转换为SqlChars?(有可能SqlChars.ToString()或SqlChars.ToSqlString()).
我没有找到任何C#代码.
我有一个独特的问题.我正在将一个dll注册为SQL Server数据库中的一个程序集,该数据库接收一个SQLXml变量以及两个字符串,并将数据序列化为JSON格式.
作为参考,这里是方法调用:
[SqlProcedure]
public static void Receipt(SqlString initiatorPassword,
SqlString initiatorId,
SqlXml XMLOut,
out SqlString strMessge)
Run Code Online (Sandbox Code Playgroud)
如果这是任何其他类型的应用程序,我会使用Newtonsoft.Json或Jayrock这个应用程序.通常我会按照这里给出的答案做一些类似的事情:
XmlReader r = (XmlReader)XmlOut.CreateReader();
XmlDocument doc = new XmlDocument();
doc.load(r);
Run Code Online (Sandbox Code Playgroud)
但是,由于我使用的是SQLClr,因此有一定的规则.其中之一就是.Load()不能使用任何其他继承的方法. 我认为.Net框架说得最好:
System.InvalidOperationException:无法加载动态生成的序列化程序集.在某些托管环境中,组件加载功能受到限制,请考虑使用预生成的序列化程序.有关更多信息,请参阅内部异常.---> System.IO.FileLoadException:
主机已禁用LoadFrom(),LoadFile(),Load(byte [])和LoadModule().
我无论如何都不能流利使用SqlClr,但是如果我正确地理解了这个博客,这是由于SqlCLR的规则不允许.Load()和继承的方法而没有签名并具有强名称.我的DLL和我正在使用的第三方DLL没有强名称,也不能自己重建和签名.所以,这使我无法在不使用负载的情况下尝试完成此任务(除非有人知道另一种方法可以完成)
我能提出的唯一解决方案是一个非常难看的while循环,它无法正常工作,我得到了一个"Jayrock.Json.JsonException:JSON对象中的JSON成员值必须以其成员名称开头"异常.这是我写的while循环(不是我最好的代码,我知道):
int lastdepth = -1;
Boolean objend = true;
Boolean wt = false;
//Write Member/Object statements for the header omitted
JsonWriter w = new JsonTextWriter()
while (m.Read())
{
if ((lastdepth == -1) && (m.IsStartElement()))
{//Checking for root element
lastdepth = …Run Code Online (Sandbox Code Playgroud) 我的开发数据库中出现以下错误:
A .NET Framework error occurred during execution of user-defined routine or aggregate "SpCreateTable":
System.Security.HostProtectionException: Attempted to perform an operation that was forbidden by the CLR host.
The protected resources (only available with full trust) were: All
The demanded resources were: Synchronization, ExternalThreading
Run Code Online (Sandbox Code Playgroud)
设置trustworthy = on的正确解决方案是什么?这有什么安全问题?
我想压缩一些包含很少或根本不读取的历史数据的大型表.我已经第一次尝试使用内置的压缩(row,page,column stored,column-stored archive),但他们都没有可以压缩外的行值(varchar(max),nvarchar(max)),最后终会试着用CLR解决方案.
在SQL服务器压缩的行集样品液压缩通过使用用户定义的特定查询返回的整个行集CLR类型.
例如:
CREATE TABLE Archive
(
[Date] DATETIME2 DEFAULT(GETUTCDATE())
,[Data] [dbo].[CompressedRowset]
)
INSERT INTO Archive([Data])
SELECT [dbo].[CompressQueryResults]('SELECT * FROM [dbo].[A]')
Run Code Online (Sandbox Code Playgroud)
它工作正常,但我遇到了以下问题:
当我尝试压缩大型结果行集时,我收到以下错误:
消息0,级别11,状态0,行0当前命令发生严重错误.结果(如果有的话)应该被丢弃.
此外,以下声明正在起作用:
SELECT [dbo].[CompressQueryResults] ('SELECT * FROM [dbo].[LargeA]')
Run Code Online (Sandbox Code Playgroud)
但这些不是:
INSERT INTO Archive
SELECT [dbo].[CompressQueryResults] ('SELECT * FROM [dbo].[LargeA]'
DECLARE @A [dbo].[CompressedRowset]
SELECT @A = [dbo].[CompressQueryResults] ('SELECT * FROM [dbo].[LargeA]')
Run Code Online (Sandbox Code Playgroud)为了压缩行集t-sql type应该映射到 .net type; …
我正在使用Visual Studio 2013创建一个新的SQL CLR,并且在Project Properties中将Default Schema设置为'decASM'(是'dbo').当我进行此更改并重建项目VS时,生成一个sql文件,如下所示:
--------------------------------------------------------------------------------
-- This code was generated by a tool.
--
-- Changes to this file may cause incorrect behavior and will be lost if
-- the code is regenerated.
--------------------------------------------------------------------------------
CREATE FUNCTION [decASM].[ExecFoxPro_SayHello] (@name [nvarchar](MAX))
RETURNS [nvarchar](MAX)
AS EXTERNAL NAME [dcFoxProAssy].[UserDefinedFunctions].[ExecFoxPro_SayHello];
GO
CREATE FUNCTION [decASM].[GetAllowedPaths] (@serviceUrl [nvarchar](MAX))
RETURNS [nvarchar](MAX)
AS EXTERNAL NAME [dcFoxProAssy].[UserDefinedFunctions].[GetAllowedPaths];
GO
CREATE FUNCTION [decASM].[GetTableRowCount] (@serviceUrl [nvarchar](MAX), @foxProPath [nvarchar](MAX), @tableName [nvarchar](MAX))
RETURNS [nvarchar](MAX)
AS EXTERNAL NAME [dcFoxProAssy].[UserDefinedFunctions].[GetTableRowCount];
GO
Run Code Online (Sandbox Code Playgroud)
每个CREATE FUNCTION调用都有一个错误:
Error 1 …Run Code Online (Sandbox Code Playgroud) sql-server schema sqlclr visual-studio-2013 sql-server-data-tools
我在安全级别=的C#6.0 .NET 3.5 CLR程序集中编写了一些代码external_access.
减少代码:
public static readonly DataTable warnings_table = init_warnings_table();
public static void set_warning(string msg)
{
var row = warnings_table.NewRow();
row[1] = DateTime.Now;
row[2] = msg;
...
warnings_table.Rows.Add(row);
}
[Microsoft.SqlServer.Server.SqlProcedure]
public static SqlInt32 wrapper_func(SqlInt32 param)
{
return big_func(Param.Value);
}
int big_func(int param)
{
SqlBulkCopy bulkcopy;
....
set_warning("Message");
....
write_warnings(bulkcopy);
warnings_table.Clear();
}
Run Code Online (Sandbox Code Playgroud)
warnings_table如果wrapper_func将同时从2个或更多个不同的连接/会话中调用,将会发生什么?静态字段有写操作warnings_table.所以,我想,但不确定,这将导致数据竞争条件.
换一种说法:
static read-onlySQLCLR中的变量是否对每个sql连接/ sql查询/事务都是唯一的,或者它们是否在不同的SQLCLR过程调用之间共享数据?
是否有可能拥有无痛的全局状态,不受其他SQLCLR程序调用的影响?
我使用SQL Server CLR集成来创建一个ASSEMBLY.
加载命令:
CREATE ASSEMBLY TcpClr FROM 'G:\TcpClrTest.dll' WITH PERMISSION_SET = UNSAFE
没有App.Config
DLL代码包含:
string ip=ConfigurationManager.AppSettings["connection"].ToString();
App.config还包含:
<appSettings>
<add key="connection" value="127.0.0.1"/>
</appSettings>
但是当我执行PROCEDURE时,SQL Server显示错误 System.NullReferenceException
SQL Server CLR集成是否支持App.config文件?
c# sql-server configurationmanager sqlclr configuration-files
我有一个返回表的SQL Server 2012存储过程.我必须修改该SP以向返回的表添加其他值.不幸的是,这种附加值来自对Web服务的调用.从我的研究中,我收集主要的方法是在SQL中使用OLE自动化程序(sp_OA ...),或者使用SQLCLR存储过程.给定sp_OA ...过程运行的安全上下文,单个返回值是VARCHAR(10)注册密钥,并且对服务的调用很少(每小时10到20个),我猜测SQLCLR方法是要走的路.此外,Web服务托管在我们的Intranet上,外部世界无法访问.
有没有更好的方法来完成我需要的东西?更好的意思是更高性能,更好的安全性,更容易编码和维护
sqlclr ×10
sql-server ×7
c# ×6
.net ×3
t-sql ×2
.net-2.0 ×1
clr ×1
deployment ×1
full-trust ×1
json ×1
schema ×1
security ×1
sql ×1
types ×1
web-services ×1
xml ×1