【问题标题】:How to get the Microsoft SQLCLR Stored Procedure Example to work如何让 Microsoft SQLCLR 存储过程示例工作
【发布时间】:2016-10-26 08:56:01
【问题描述】:

我是 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... 另外这个错误:

错误 1 ​​SQL72014:.Net SqlClient 数据提供者:
消息 9982,级别 16,状态 100,第 1 行无法在用户实例中使用全文搜索。
C:\Users\Torsten\AppData\Local\Temp\CLR Test_1_Update3.publish.sql 47 1

我什至不确定这是将数据库放入空数据库的正确方法,MS教程甚至没有达到VS2013,而只有VS2010......

【问题讨论】:

  • 你得到哪个错误?
  • CREATE FULLTEXT CATALOG 和什么有什么关系?你复制粘贴错了吗?或者您是否可能在某处忘记了GO,导致此语句被视为前一个语句的一部分?
  • 错误:SQL72045:脚本执行错误。执行的脚本: CREATE FULLTEXT CATALOG [AW2014FullTextCatalog] WITH ACCENT_SENSITIVITY = ON AS DEFAULT AUTHORIZATION [dbo];
  • 这不是SQL Server返回的错误,是SSDT部署过程返回的错误。真正的错误应该隐藏在输出窗口的某个地方,您可能必须增加详细程度。或者,如果您想走捷径,在数据库项目中找到全文目录并将其删除——它是 Adventure Works 的一部分,但与测试 CLR 存储过程的工作方式无关。
  • @user26026 如果问题很清楚,那么其他人就不会要求澄清。此外,当声明发生错误但特定(和完整)SQL Server 错误消息尚未包含在问题中时,很难将问题视为“明确”。

标签: c# .net sql-server stored-procedures sqlclr


【解决方案1】:

如果您不了解 SQLCLR,甚至不熟悉 SSMS/Visual Studio 中的“SQLCMD 模式”(因此会出现以 :setvar 开头的行的语法错误),那么您不应该从 Microsoft 示例开始。例如,问题中链接的教程甚至在顶部指出:

本文档已存档,不再维护。

所以,很明显,教程页面没有被仔细阅读,这里可能会发生很多事情,可能与 SQL Server、Visual Studio 等的版本差异有关。或者,可能有先决条件步骤尚未遵循的 Microsoft 教程。

相反,您应该查看我正在撰写的关于在 SQL Server Central 上使用 SQLCLR 的系列文章:

Stairway to SQLCLR

需要免费注册才能查看该站点上的内容,但这是非常值得的,因为有大量与使用 SQL Server 相关的免费信息。

我正在编写的关于 SQLCLR 的系列将引导您了解 SQLCLR 到底是什么,不是什么,它可以(和不能)做什么,SQL Server 的 CLR 主机环境和 Windows CLR 主机之间的区别(即“常规”.NET 环境)以及 SQLCLR 的运行方式更像是 Web 应用程序而不是控制台应用程序/WinForm 应用程序。

我的文章中的示例是一步一步的,对正在发生的事情进行了完整的解释。前几篇文章提供了工作程序集,因为在对环境有基本了解之前,不应该搞乱创建 SQLCLR 对象,考虑到在 SQL Server 中工作的限制和细微差别,如果您刚开始创建 SQLCLR 可能会很危险对象没有任何基础来理解你在做什么以及你是否应该这样做。

在那之后,然后(也许)再看看微软的例子。但很可能是您不需要 SQLCLR(即 T-SQL 就可以了),或者您可能无法在 T-SQL 中执行您想要的操作,但在 SQLCLR 中执行此操作将无法正常工作,因为环境限制。


关于您正在编写的过时教程,我不明白您为什么要尝试在您的 Visual Studio / SSDT 项目中包含 AdventureWorks2014。您应该能够忽略现有的架构/对象并发布到它。

【讨论】:

  • 谢谢,我去看看。其实我的一个朋友有更多的知识,但是他现在很忙而且生病了(他的SD工作压力太大),昨天晚上Skype共享显示器不起作用,所以我作为一个好奇的人想看看我自己并获得了一些初步知识,所以我只是点击了 MS 入门页面。在我们的项目中,他是具有 MSSQL 和 .NET 知识的人,而我负责算法。由于我从未设置过服务器项目,因此我不确定我是否做错了什么。
  • @user26026 根据您所说的和您要执行的操作:1) 我已经更新了我的答案,提供了一些说明和一些附加信息,并且 2)强烈建议您您的朋友/同事在尝试在此 Microsoft 上取得更多进展之前查看我链接到的 SQLCLR 上的系列教程。
  • 您好,推荐的 tutotial 版本实际上也是这样说的:“以下代码示例创建了一个存储过程,它将记录插入 Adventure Works 示例数据库的 Currency 表中。”存储过程 InsertCurrency_CS 插入到 Sales.Currency,它是 Adventure Works 的一个表。因此,如果我通过 test.sql 执行 InsertCurrency,我想我需要 Adventure Works,因为它是由 InsertCurrency_CS 处理的。
  • 我想我的朋友已经在 CLR 工作了一段时间了......他只是还没有时间(从昨天开始)帮助我(他现在发烧了)和我不想浪费时间和准备自己。我们都在数学专业学习和毕业,他在学习期间一直在做开发人员,而我没有,我只有算法和几种编程语言的背景,但除了 SQL 并没有真正使用更多。 (没有 TSQL 等)
  • @user26026 我认为你跳得太快太快了。在处理高级主题之前,您需要了解很多基础知识,这是一个高级主题。即使您使本教程正常工作,您仍然几乎不知道您在看什么,或者这是否适用于您的问题。这不是侮辱;我只是想帮你。我不是在质疑你学习这些东西的能力,只是建议根据你的经验,你首先要了解很多关于 SQL Server 和 SSDT 项目的知识。 (续...)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-09
  • 1970-01-01
  • 2012-06-21
  • 2016-07-24
  • 1970-01-01
  • 1970-01-01
  • 2019-03-12
相关资源
最近更新 更多