2016-10-26 33 views
0

我是CLR的新手,并且已经在Microsoft教程中苦苦挣扎。
这是教程:How to: Create and Run a CLR SQL Server Stored Procedure如何让Microsoft SQLCLR存储过程示例工作

有一个例子存储过程Insert_Currency_CS和TEST.SQL

using System; 
using System.Data; 
using System.Data.SqlClient; 
using System.Data.SqlTypes; 
using Microsoft.SqlServer.Server; 


public partial class StoredProcedures 
{ 
    [SqlProcedure()] 
    public static void InsertCurrency_CS(
     SqlString currencyCode, SqlString name) 
    { 
     using (SqlConnection conn = new SqlConnection("context connection=true")) 
     { 
      SqlCommand InsertCurrencyCommand = new SqlCommand(); 
      SqlParameter currencyCodeParam = new SqlParameter("@CurrencyCode", SqlDbType.NVarChar); 
      SqlParameter nameParam = new SqlParameter("@Name", SqlDbType.NVarChar); 

      currencyCodeParam.Value = currencyCode; 
      nameParam.Value = name; 

      InsertCurrencyCommand.Parameters.Add(currencyCodeParam); 
      InsertCurrencyCommand.Parameters.Add(nameParam); 

      InsertCurrencyCommand.CommandText = 
       "INSERT Sales.Currency (CurrencyCode, Name, ModifiedDate)" + 
       " VALUES(@CurrencyCode, @Name, GetDate())"; 

      InsertCurrencyCommand.Connection = conn; 

      conn.Open(); 
      InsertCurrencyCommand.ExecuteNonQuery(); 
      conn.Close(); 
     } 
    } 
} 

EXEC InsertCurrency 'AAA', 'Currency Test' 
SELECT * from Sales.Currency where CurrencyCode = 'AAA' 

为了得到这个工作,我要补充的AdventureWorks2014我想,所以我刚添加它作为新的数据库项目到我的解决方案可以将其内容(表和2个脚本)复制到我的解决方案资源管理器中的第一个项目数据库。但后来我得到语法错误,并在例如这些线路不承认我的部署脚本CLRTest.sql选项错误:

GO 
:setvar DatabaseName "CLRTest" 
:setvar DefaultFilePrefix "CLRTest" 
:setvar DefaultDataPath "C:\Users\Torsten\AppData\Local\Microsoft\VisualStudio\SSDT\CLRTest" 
:setvar DefaultLogPath "C:\Users\Torsten\AppData\Local\Microsoft\VisualStudio\SSDT\CLRTest" 

第一:SETVAR行我得到的语法错误和数据库名称是无法识别的选项。同样在这里

:on error exit 

这里

:setvar __IsSqlCmdEnabled "True" 

现在可以也许有人解释我如何使我的数据库项目中使用AdventureWorks2014数据库,使教程CLR存储过程工作时,被测试执行.SQL。

我想问题是我不知道如何把AdventureWorks2014数据库放到我的空数据库项目中。我正在尝试SQLSchemaCompare,然后更新目标(localdb)\ ProjectsV12.CLR测试。在这里,我有问题,如果我在升级包括AW2014FullTextCatalog,我收到一个脚本执行错误,如果我排除它,我得到另一个脚本中的错误CREATE FULLTEXT INDEX ON ... 此外这个错误:

Error 1 SQL72014: .Net SqlClient Data Provider:
Msg 9982, Level 16, State 100, Line 1 Cannot use full-text search in user instance.
C:\Users\Torsten\AppData\Local\Temp\CLR Test_1_Update3.publish.sql 47 1

我甚至不能肯定的是,这是把一个数据库导入空数据库以正确的方式,在MS教程甚至没有达到VS2013但只有VS2010 ...

+0

你会得到哪个错误? – rbr94

+1

“CREATE FULLTEXT CATALOG”与什么有关?你是否复制粘贴错误的东西?或者你是否可能在某处忘记了一个“GO”,导致该陈述被视为前一个陈述的一部分? –

+0

错误:SQL72045:脚本执行错误。执行的脚本: CREATE FULLTEXT CATALOG [AW2014FullTextCatalog] WITH ACCENT_SENSITIVITY = ON AS DEFAULT AUTHORIZATION [dbo]; – user26026

回答

0

如果你有没有了解SQLCLR,甚至不熟悉SSMS/Visual Studio中的“SQLCMD模式”(因此在:setvar之后的行中的语法错误),那么您不应该从Microsoft示例开始。例如,在这个问题挂教程甚至指出,在顶部:

This documentation is archived and is not being maintained.

因此,很明显本教程页面没有被仔细阅读和任意数量的东西可以怎么回事,可能与SQL Server,Visual Studio等版本的差异。或者,可能需要执行尚未遵循的Microsoft教程的先决条件。

相反,你应该检查该系列的我写的文章与SQLCLR上的SQL Server中央工作:

Stairway to SQLCLR

需要免费注册,查看该网站的内容,但它是值得因为有大量与SQL Server一起工作的免费信息。

我正在编写的关于SQLCLR的系列将指导您完成SQLCLR究竟是什么,不是它能做什么(不能)做什么,SQL Server的CLR主机环境和Windows CLR主机之间的区别(即“常规”.NET环境)以及SQLCLR比控制台应用程序/ WinForm应用程序更像Web应用程序的事实。

我的文章中的例子是一步一步完整解释发生了什么。前几篇文章提供了工作程序集,因为除非对环境有基本的了解,否则不应该搞乱创建SQLCLR对象,因为在SQL Server中工作的限制和细微差别,如果您刚刚开始创建SQLCLR对象没有任何理解你在做什么的基础,你是否应该这样做。

之后,然后(也许)再看看微软的例子。但很可能是你不需要SQLCLR(即T-SQL很好),或者你可能无法在T-SQL中执行你想要的操作,但是在SQLCLR中执行它不会工作,因为环境约束。


至于你正在使用的过时的教程中,我不明白为什么您要包括AdventureWorks2014在你的Visual Studio/SSDT项目。您应该能够忽略现有的模式/对象并发布给它。

+0

谢谢,我会看看。实际上,我的一个朋友有更多的知识,但他现在和昨天晚上都很忙,生病了(他的SD工作压力太大),Skype共享显示器没有工作,所以我作为一个好奇的人想看一看我自己,并获得一些第一知识,所以我只是打在MS入门页面。在我们的项目中,他是具有MSSQL和.NET知识的人,我是那里的算法。因为我从来没有建立过一个服务器项目,所以我不确定我是否做错了什么。 – user26026

+0

@ user26026根据你在说什么,你想做什么:** 1)**我已经更新了我的答案,并附有一些说明和一些额外的信息,并且** 2)**我强烈建议你和__在尝试在此Microsoft教程中取得更多进展之前,您的朋友/同事会检查我链接到的SQLCLR系列。 –

+0

您好推荐版本的tutotial actaully说:“以下代码示例创建一个存储过程,将记录插入到Adventure Works示例数据库的Currency表中。”存储过程InsertCurrency_CS插入Sales.Currency中,该表是Adventure Works的一个表。所以如果我通过test.sql执行InsertCurrency,我想我需要Adventure Works,因为它正在被InsertCurrency_CS所支持。 – user26026