Visual Studio 2013 CLR存储过程

Joh*_*ohn 7 sql-server stored-procedures sqlclr visual-studio-2013

我一直在使用早期版本的Visual Studio(VS2008)和SQL Server 2008.

最近我的组织搬到了VS2013和SQL Server 2012.我发现VS2013中的数据库接口与VS2008中的数据库接口有很大的不同.

我的问题基本上是,如果有人知道一篇文章或引用,详细说明如何做这里描述的内容:

http://yassershaikh.com/how-to-create-a-clr-stored-procedure-using-c-and-visual-studio/

(特别是将DLL部署到SQL Server 2012数据库).

但是使用VS2013和SQL Server 2012.

Sol*_*zky 15

(如果此处的信息与您看到的信息之间存在细微差别,我将在Windows 8上运行带有SSDT 11.1.31203.1的Visual Studio 2012 Update 4)

在VS 2008/VS 2010中,您可以"部署"一个数据库项目(即分别为.csproj/ .dbprojfile),以将程序集和T-SQL包装器对象导入SQL Server.较新版本的Visual Studio仍然在"Build"菜单中有"Deploy"选项(至少VS 2012将它们用于解决方案和项目),但它们没有做任何事情.您现在有了一个.sqlproj文件,将解决方案/项目导入数据库的方法是使用"Build"菜单中的"Publish {SolutionName} ..."选项.

更多关于发布的消息.首先,这里有一些可能有用的信息:

SQL Server/SSDT

  • SQL Server项目(即.sqlproj)通过SQL Server数据工具(SSDT)显式处理
  • 默认情况下,Visual Studio/SSDT指向本地SQL Server数据库.首选项是使用SQL Server Express Edition(也参见SQL Server Express用户实例),但从SQL Server 2012开始,Express Edition的新版本称为"Express Edition LocalDB"(通常称为"LocalDB")
  • SQL Server Express LocalDB实例位于以下路径中:
    C:\Users\{User Name}\AppData\Local\Microsoft\Microsoft SQL Server Local DB\Instances\{Instance Name}
  • 您使用以下约定连接到LocalDB:
    (localdb)\{Instance Name}
  • 创建新解决方案时,将在以下位置创建用于存放每个项目数据库文件的文件夹:
    C:\Users\{User Name}\AppData\Local\Microsoft\VisualStudio\SSDT\{Solution Name}
  • 在该...\SSDT\{Solution Name}文件夹中,每个项目至少有两个文件:
    • {Project Name}.mdf
    • {Project Name}.ldf
  • 如果向该解决方案添加更多项目,则新文件将显示在该...\SSDT\{Solution Name}文件夹中
  • 初始创建新项目时创建解决方案文件夹和每个项目数据库文件,无论您是否使用它们;-)

视觉工作室

  • "项目属性"中有3个主要选项卡,用于控制脚本和可能发布的内容
  • 项目设置
    • 在"输出类型"下,"创建脚本(.sql文件)"复选框控制构建操作是否创建要删除的SQL脚本并至少使用程序集重新创建数据库:
      {Build Output Path}\{Build Output File Name}_Create.sql
  • SQL CLR
    • "生成DDL"复选框控制是否创建T-SQL包装器对象:
      CREATE {Object Type} {Object Name} ... AS EXTERNAL NAME {Assembly Name}.{Class Name}.{Method Name OR "name" property, if specified, in the [SqlProcedure] / [SqlFunction] / [SqlUserDefinedAggregate] / [SqlUserDefinedType] / [SqlTrigger] attribute}
    • "包含符号"复选框控制是否将{Assembly Name}.pdb文件导入SQL Server(in sys.assembly_files); 即使取消选中此选项,.pdb也会在该文件中创建该文件{Build Output Path}.
  • 建立
    • 这些不是特定于SQLCLR的
    • "构建输出路径:"控制最终的DLL,PDB,SQL和DACPAC文件的位置
    • "构建输出文件名:"控制SQL脚本和DACPAC文件的名称
  • " 部署"选项卡已删除
    • 此选项卡有一个"部署代码"复选框,其中包含.pdb文件源代码(.cs和/或.vb.)文件作为ALTER ASSEMBLY {Assembly Name} ADD FILE FROM 0x... AS {File Name}条目.此选项似乎已被SQL CLR选项卡上的"包含符号"复选框所取代,该选项卡仅包含.pdb文件而不包含源代码文件.[我认为这是一种改进,因为我从不喜欢部署源代码的想法,因为有些人(可能很多?)将所有这些东西提升为生产:-(.]

选择"Build"菜单中的"Publish {Solution Name} ..."选项将弹出一个"Publish Database"对话框,询问数据库详细信息.对于"目标数据库连接:",单击右侧的"编辑..."按钮.将打开"连接属性"对话框."服务器名称:"会有一个下拉列表,您可以下拉以发现实例或只输入名称.如果你有一个在本地运行的默认实例,你应该只能输入"(local)"[但没有双引号].下一节"登录到服务器"中的默认身份验证是"使用Windows身份验证".如果您使用的是SQL Server登录,则可以选择其他单选按钮并输入"用户名:"和"密码:"详细信息.下一部分是"连接到数据库",并且已选择"选择或输入数据库名称:"的顶部单选按钮.有一个下拉列表,如果下拉,将填充在"服务器名称:"下拉列表中选择(或输入)的服务器上的数据库列表.选择或输入所需的数据库,然后单击对话框左下角的"测试连接"按钮.您应该弹出一个"测试连接成功"的弹出窗口,然后单击该弹出窗口中的"确定"按钮,然后单击"连接属性"对话框中的"确定"按钮.

现在你可以:

  1. 单击"将配置文件另存为..."按钮("发布数据库"对话框的左下角)
  2. 下次,只需单击"加载配置文件..."按钮(它将具有可见设置以及"高级..."按钮中配置的任何设置)
  3. 点击
    • "发布"按钮立即推送到数据库
    • "生成脚本"按钮以简单地创建发布SQL脚本:
      {Build Output Path}\{Build Output File Name}.publish.sql
  4. 您还可以部署DACPAC文件:数据层应用程序

仅供参考:创建对象的基本T-SQL片段可以在以下位置找到,但是您应该注意不要按原样运行SQL脚本,因为这些项目不是可运行的顺序:
{ProjectDir}\obj\{Configuration Name}\{Assembly Name}.generated.sql

对于上面几个特定于Visual Studio的引用,这些是您在UI中看到的字段的名称.它们在.sqlproj文件中的等价物是:

  • {项目名称} == <Name>
  • {Assembly Name} == <AssemblyName>
  • {Build Output Path} == <OutputPath>
  • {构建输出文件名} == <SqlTargetName>
  • "创建脚本(.sql文件)"复选框== <GenerateCreateScript>
  • "生成DDL"复选框== <GenerateSqlClrDdl>
  • "包括符号"复选框== <GenerateSqlClrSymbols>

有关SQLCLR的更多信息,我正在编写一个关于SQL Server Central(需要免费注册)的系列文章,称为" Stoway to SQLCLR ".(目前只发表了4篇文章,最终将是12篇.下一篇,巧合的是,发展与Visual Studio :-))

编辑:
一个有趣的,也是最好的新功能是验证依赖关系以给出T-SQL对象的编译时错误,就像.Net语言一样.缺点是似乎没有办法禁用它.除了基于CLR的触发器之外,这通常不会影响SQL CLR项目.这里的问题是,如果你启用了"生成DDL"选项,以做"构建"你需要有TargetEvent该属性SqlTrigger填写属性.并且,模型(即数据库模型)验证步骤将检查以使Target属性中指定的表实际存在.如果没有,您将收到unresolved reference to object错误.看来,传递此方法的唯一方法是a)在项目中拥有该对象,或者b)在引用为"数据库引用"的项目中拥有该对象:

  • 如果只需要引用几个表,最简单的方法就是CREATE TABLE在SSMS中生成语句,然后右键单击解决方案资源管理器中的项目(或转到"项目"菜单)并转到"导入" - >脚本(*.sql)......".
  • 如果你在很多不同的表上有很多触发器,那么你可以:
    • 在同一解决方案中创建一个新项目:
      • 在解决方案资源管理器中右键单击项目名称(或转到"项目"菜单)
      • 转到"导入 - >"
      • 选择"数据库......"
      • 输入连接信息
    • 将架构解压缩到.dacpac文件:
      • 转到VS中的"SQL Server对象资源管理器"
      • 选择您的服务器并展开数据库列表
      • 右键单击有问题的数据库
      • 选择"提取数据层应用程序......"
      • 选择一个位置并输入文件名(在"磁盘上的文件"字段中).
      • 单击"确定"按钮
    • 无论您选择哪种方法,都需要将其添加为"数据库参考":
      • 右键单击主项目中的"References"文件夹(或转到"Project"菜单)
      • 转到"添加数据库引用..."
      • 根据您选择的方法,选择"当前解决方案中的数据库项目"或"数据层应用程序(.dacpac)"
      • 选择新创建的项目或.dacpac文件
      • 对于"数据库位置:"下拉列表,您必须选择"相同数据库"!
      • 单击"确定"按钮

记住:

  • 如果导入单个表,您可能还需要导入可能在任何正在导入的表上的外键中引用的任何表
  • 每次CREATE TABLE都会在_Create脚本中生成完整的DDL ,但"发布"脚本将仅包含用于更改的DDL,因此如果表的定义没有更改,则表DDL将不会出现在"发布"中" .sql脚本.通过将项目或.dacpac文件中的表定义与"发布"对话框/向导的"连接设置"中定义的目标数据库进行比较来确定更改.