我正在研究一个基于Linq的CLR存储过程,用于一些复杂的过滤和操作,否则如果在更"传统"的存储过程中实现,则需要大量凌乱且性能不佳的T-SQL代码.
这工作得很好,但我找不到如何在部署阶段设置此存储过程的模式,以便更好地组织和分离模块中的数据库对象.
有任何想法吗?
提前谢谢了.
sql-server stored-procedures sql-server-2005 sqlclr sql-server-data-tools
我有一个应用程序,使用sp_helptext检索存储过程的文本.它适用于除 CLR存储过程之外的所有存储过程.如果我尝试sp_helptext在SQLCLR存储过程上使用,我会收到此错误:
对象'PROC_NAME'没有文字
我知道SSMS可以在我使用"script as" - >"create to" - >命令时执行此操作.
但是当我使用SQL Server Profiler跟踪SSMS"生成脚本"操作时,它给了我一个相当复杂的活动的令人生畏的长列表.如果必须的话,我可以通过它,但有没有人知道以编程方式获取CLR存储过程的代码的简单方法?
编辑以澄清
我不希望看到程序集中的实际代码; 我只想要一种简单的方法来查看T-SQL代码,如下例所示:
CREATE PROCEDURE [dbo].[MY_PROC]
@PARAM1 [xml],
@PARAM2 [uniqueidentifier],
@PARAM3 [nvarchar](255),
@PARAM4[bit] = False
WITH EXECUTE AS OWNER
AS
EXTERNAL NAME [SomeSolution.SomeProject].[SomeAssembly].[SomeMethod]
GO
Run Code Online (Sandbox Code Playgroud)
换句话说,SQLCLR函数的"SQL Server端".
我有一个像这样的SQL CLR函数:
public partial class UserDefinedFunctions {
[Microsoft.SqlServer.Server.SqlFunction(TableDefinition = "number int", FillRowMethodName = "FillRow")]
public static IEnumerable MyClrFunction(object obj) {
// read obj array input and then
var result = new ArrayList();
result.Add((SqlInt32)1);
result.Add((SqlInt32)2);
result.Add((SqlInt32)3);
return result;
}
public static void FillRow(object obj, out SqlInt32 number) {
number = (SqlInt32)obj;
}
}
Run Code Online (Sandbox Code Playgroud)
我想用这种方式使用它:
DECLARE @x arrayOfInt
INSERT INTO @x VALUES (10)
INSERT INTO @x VALUES (20)
INSERT INTO @x VALUES (30)
SELECT * FROM dbo.MyClrFunction(@x)
Run Code Online (Sandbox Code Playgroud)
arrayOfInt是:
CREATE TYPE [dbo].[arrayOfInt] …Run Code Online (Sandbox Code Playgroud) sql-server sqlclr user-defined-functions table-valued-parameters
当我尝试通过VS2010中的SQL测试脚本(使用MSSQL 2008)调试SQL CLR时,一旦部署完成,我就会在调试输出窗口中"取消用户"(这是成功的.)
我一直在互联网上,尝试了所有找到的解决方案,仍然没有去.
系统:
Windows Server 2008 R2 Standard SP 1
64位Visual Studio 2010
Ultimate SQL Server 2008 R2(两者都在同一台计算机上运行)
采取的步骤:
通过:http://msdn.microsoft.com/en-us/library/ms165051.aspx
并且:http://msdn.microsoft.com/en-us/library/ee828498.aspx
尝试将Target Framework设置为2.0(从3.5开始)
在"部署"部分下的项目属性中尝试未选中"部署代码".
在项目属性中的数据库下设置为"不安全",并将程序集所有者设置为"dbo".
寻找启用CLR集成我找到了这个文档:http://msdn.microsoft.com/en-us/library/ms131048.aspx,它说使用以下代码将"crl enabled"变量设置为1.
sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
sp_configure 'clr enabled', 1;
GO
RECONFIGURE;
GO
Run Code Online (Sandbox Code Playgroud)
我想知道如果需要重新启动SQL Server?或者,更具体地说,为了启用CRL集成,要遵循哪些步骤?
sql-server configuration sqlclr sql-server-2008 sql-server-2008-r2
我正在努力更新当前选择最多n行的存储过程,如果返回的行= n,则执行没有限制的选择计数,然后返回原始选择和受影响的总行数.
有点像:
SELECT TOP (@rowsToReturn)
A.data1,
A.data2
FROM
mytable A
SET @maxRows = @@ROWCOUNT
IF @rowsToReturn = @@ROWCOUNT
BEGIN
SET @maxRows = (SELECT COUNT(1) FROM mytableA)
END
Run Code Online (Sandbox Code Playgroud)
我想把它减少到一个select语句.基于这个问题,COUNT(*) OVER()允许这个,但是它被放在每一行而不是输出参数中.也许像FOUND_ROWS()MYSQL中的东西,比如@@ TOTALROWCOUNT等.
作为旁注,由于实际选择具有order by,数据库将需要已经遍历整个集合(以确保它获得正确的前n个有序记录),因此数据库应该已经在某处具有此计数.
我想为SQL Server创建基于SQLCLR的存储过程.如您所知,我可以针对多个版本的.NET框架构建一个DLL.我找不到一个引用来描述哪个版本的SQL Server支持哪个版本的.NET框架.任何人都可以帮我指出正确的方向吗?
我写了一个简单的UDF,应绘制图形并将其保存在磁盘上.实际上,我使用UDF作为SQL SERVER和R之间的代理,因此UDF只通过DCOM将R脚本从SQL SERVER传递给R引擎.一切正常,直到我尝试绘制图形或将其保存到磁盘.我使用UNSAFE权限创建了程序集.
所以,它是这样的:SQL引擎 - > UDF - >(D)COM服务器 - > R - >(D)COM服务器 - > UDF - > SQL引擎.
所以,我的第一个问题是,我可以从UDF创建GUI吗?我猜不是,但值得一提.
第二个问题是,为什么具有UNSAFE权限的程序集无法访问文件系统.我没有收到任何错误,只是没有任何反应.
R环境位于不同的地址空间中,因此我没有看到SQL Engine对CLR的权限会影响它的任何原因.
谢谢
编辑:
我尝试用程序做同样的事情.现在创建一个空文件.这是我的R测试代码:
jpeg("C:\\test1.jpg"); x <- rnorm(100); hist(x); dev.off()
Run Code Online (Sandbox Code Playgroud)
知道这里发生了什么吗?
我有一个问题,我无法解决.我正在使用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#代码.
是否有一种普遍接受的标准方式从SQL Server 2012发送HTTP请求?
我想要做的是使用远程服务器处理搜索查询,然后将结果插回到SQL Server 2012数据库.远程服务器提供了一个web api,它接受带有JSON内容的POST请求.
我有一个有效的解决方案,但需要将多个程序集加载到SQL Server中.其中一些程序集不完全受支持(例如System.Net.Http.dll),发出如下警告:
警告:Microsoft .NET Framework程序集"system.net.http,version = 4.0.0.0,culture = neutral,publickeytoken = b03f5f7f11d50a3a,processorarchitecture = msil." 您正在注册未在SQL Server托管环境中进行全面测试,并且不受支持.将来,如果升级或维护此程序集或.NET Framework,则CLR集成例程可能会停止工作.有关更多详细信息,请参阅SQL Server联机丛书.
我想知道是否有更好/更安全的方式不需要加载所有这些组件?
我的存储过程的CLR代码:
[Microsoft.SqlServer.Server.SqlProcedure]
public static void SendSearchRequestProcedure (string query, string table)
{
RunAsync(query,table).Wait();
}
static async Task RunAsync(string query, string table)
{
using (var client = new HttpClient())
{
HttpResponseMessage response;
client.BaseAddress = new Uri("http://localhost:9000/");
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
var search = new Search() { Query = query, Table = table };
response = await client.PostAsJsonAsync("api/search/", search); …Run Code Online (Sandbox Code Playgroud)