如何让 Microsoft SQLCLR 存储过程示例工作
How to get the Microsoft SQLCLR Stored Procedure Example to work
我是 CLR 的新手,并且已经在努力学习 Microsoft 教程。
这是教程:How to: Create and Run a CLR SQL Server Stored Procedure
有一个示例存储过程 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 出现语法错误,DataBaseName 不是可识别的选项。同样这里
:on error exit
这里
:setvar __IsSqlCmdEnabled "True"
现在有人可以向我解释如何让我的数据库项目使用 AdventureWorks2014 数据库,以便教程 CLR 存储过程在被 test.sql 执行时正常工作。
我想问题是我不知道如何将 AdventureWorks2014 数据库放入我的空数据库项目中。我现在正在尝试 SQLSchemaCompare,然后更新 Target (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...
如果您不了解 SQLCLR,甚至不熟悉 SSMS 中的 "SQLCMD mode" / Visual Studio(因此以 :setvar
开头的行中存在语法错误),那么您不应该从 Microsoft 示例开始。例如,问题中链接的教程甚至在顶部指出:
This documentation is archived and is not being maintained.
所以,很明显教程页面没有被仔细阅读,这里可能发生了很多事情,可能与 SQL 服务器、Visual Studio 等的版本差异有关。或者,可能存在尚未遵循的执行 Microsoft 教程的先决条件步骤。
相反,您应该查看我正在撰写的关于在 SQL Server Central 上使用 SQLCLR 的系列文章:
需要免费注册才能查看该站点上的内容,但这是非常值得的,因为有大量与使用 SQL 服务器相关的免费信息。
我正在撰写的关于 SQLCLR 的系列文章将指导您了解 SQLCLR 到底是什么,不是什么,它能做什么(不能做什么),它们之间的区别是什么在 SQL 服务器的 CLR 主机环境和 Windows CLR 主机(即 "regular" .NET 环境)之间,以及 SQLCLR 的运行更像是 Web 应用程序而不是控制台应用程序/WinForm 应用程序。
我的文章中的示例是循序渐进的,对正在发生的事情进行了完整的解释。为前几篇文章提供了工作程序集,因为考虑到在 SQL 服务器中工作的限制和细微差别,在对环境有基本了解之前,不应混淆创建 SQLCLR 对象如果您只是开始创建 SQLCLR 对象而没有任何基础来理解您在做什么以及您是否应该这样做,这可能是危险的。
之后,然后(也许)再看看微软的例子。但这很可能是您不需要 SQLCLR(即 T-SQL 就好),或者您可能无法在 T-[=41= 中做您想做的事] 但由于环境限制,在 SQLCLR 中执行此操作将不起作用。
关于您正在处理的过时教程,我不明白您为什么要在 Visual Studio / SSDT 项目中包含 AdventureWorks2014
。您应该能够忽略现有的模式/对象并只发布到它。
我是 CLR 的新手,并且已经在努力学习 Microsoft 教程。
这是教程:How to: Create and Run a CLR SQL Server Stored Procedure
有一个示例存储过程 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 出现语法错误,DataBaseName 不是可识别的选项。同样这里
:on error exit
这里
:setvar __IsSqlCmdEnabled "True"
现在有人可以向我解释如何让我的数据库项目使用 AdventureWorks2014 数据库,以便教程 CLR 存储过程在被 test.sql 执行时正常工作。
我想问题是我不知道如何将 AdventureWorks2014 数据库放入我的空数据库项目中。我现在正在尝试 SQLSchemaCompare,然后更新 Target (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...
如果您不了解 SQLCLR,甚至不熟悉 SSMS 中的 "SQLCMD mode" / Visual Studio(因此以 :setvar
开头的行中存在语法错误),那么您不应该从 Microsoft 示例开始。例如,问题中链接的教程甚至在顶部指出:
This documentation is archived and is not being maintained.
所以,很明显教程页面没有被仔细阅读,这里可能发生了很多事情,可能与 SQL 服务器、Visual Studio 等的版本差异有关。或者,可能存在尚未遵循的执行 Microsoft 教程的先决条件步骤。
相反,您应该查看我正在撰写的关于在 SQL Server Central 上使用 SQLCLR 的系列文章:
需要免费注册才能查看该站点上的内容,但这是非常值得的,因为有大量与使用 SQL 服务器相关的免费信息。
我正在撰写的关于 SQLCLR 的系列文章将指导您了解 SQLCLR 到底是什么,不是什么,它能做什么(不能做什么),它们之间的区别是什么在 SQL 服务器的 CLR 主机环境和 Windows CLR 主机(即 "regular" .NET 环境)之间,以及 SQLCLR 的运行更像是 Web 应用程序而不是控制台应用程序/WinForm 应用程序。
我的文章中的示例是循序渐进的,对正在发生的事情进行了完整的解释。为前几篇文章提供了工作程序集,因为考虑到在 SQL 服务器中工作的限制和细微差别,在对环境有基本了解之前,不应混淆创建 SQLCLR 对象如果您只是开始创建 SQLCLR 对象而没有任何基础来理解您在做什么以及您是否应该这样做,这可能是危险的。
之后,然后(也许)再看看微软的例子。但这很可能是您不需要 SQLCLR(即 T-SQL 就好),或者您可能无法在 T-[=41= 中做您想做的事] 但由于环境限制,在 SQLCLR 中执行此操作将不起作用。
关于您正在处理的过时教程,我不明白您为什么要在 Visual Studio / SSDT 项目中包含 AdventureWorks2014
。您应该能够忽略现有的模式/对象并只发布到它。