Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 将Visual Studio数据库项目对象部署到架构,而不是;dbo“;_Sql Server_Tsql_Deployment_Sql Server Data Tools_Sqlclr - Fatal编程技术网

Sql server 将Visual Studio数据库项目对象部署到架构,而不是;dbo“;

Sql server 将Visual Studio数据库项目对象部署到架构,而不是;dbo“;,sql-server,tsql,deployment,sql-server-data-tools,sqlclr,Sql Server,Tsql,Deployment,Sql Server Data Tools,Sqlclr,我有下面的场景 我在VisualStudio数据库项目中有一个SQLCLR存储过程。这不应该在dbo模式中,而应该在foo中。正如我所看到的,在使用VisualStudio发布功能时,不可能为SQLCLR存储过程提供不同的模式 所以我得把它包起来。现在我有两个脚本 要添加程序集,请执行以下操作: 创建程序集[MyAssembly] 从'MyAssembly.dll'; 去 另一种方法是将存储过程添加到数据库中: 创建过程[foo].[MyProc](@param NVARCHAR(10)) 作

我有下面的场景

我在VisualStudio数据库项目中有一个SQLCLR存储过程。这不应该在
dbo
模式中,而应该在
foo
中。正如我所看到的,在使用VisualStudio发布功能时,不可能为SQLCLR存储过程提供不同的模式

所以我得把它包起来。现在我有两个脚本

要添加程序集,请执行以下操作:

创建程序集[MyAssembly]
从'MyAssembly.dll';
去
另一种方法是将存储过程添加到数据库中:

创建过程[foo].[MyProc](@param NVARCHAR(10))
作为外部名称MyAssembly.ClassName.MyProc
去
但是现在我得到一个错误,因为对
MyAssembly
的引用未解析。我认为这是因为它(SQLCLR proc、T-SQL包装程序proc、汇编添加脚本)都在同一个项目中,并且是对自身的引用

在数据库中我自己的模式下部署SQLCLR存储过程的最佳方法是什么?如果可以将其直接添加到SQLCLR实现中,那就太好了


提前谢谢。

我可以自己解决。只是一个非常愚蠢的错误

我的程序集的名称具有模式
Company.Area.Technology.ProjectName
。如果我试图创建一个存储过程,则会出现一个错误,应该是一个点

CREATE PROCEDURE [foo].[MyProc](@param NVARCHAR(10))
    AS EXTERNAL NAME Company.Area.Technology.ProjectName.ClassName.MyProc
GO
解决方案是将程序集名称设置在
[]
之间

CREATE PROCEDURE [foo].[MyProc](@param NVARCHAR(10))
    AS EXTERNAL NAME [Company.Area.Technology.ProjectName].ClassName.MyProc
GO

这很有效。所以我可以将CLR过程包装到我自己的模式中。

实际上,这应该不是问题。从VisualStudio2012开始,有一个选项可以设置T-SQL包装器对象的模式。在项目属性中,转到“项目设置”选项卡,在右侧的“常规”部分下,有一个标记为“默认模式”的文本字段。这是用于T-SQL包装器对象的模式(我通常不使用SSDT部署,所以我只是在Visual Studio 2015中再次确认了此信息-我知道,我知道,我真的需要更新)

我在回答以下问题时也提到了这一点:

如果您使用的Visual Studio/SSDT版本没有设置模式的选项,或者如果您需要将对象放置到多个模式中,则应该能够简单地添加一个T-SQL部署后脚本,将对象移动到所需的模式。通过添加一个T-SQL脚本并将属性设置为“部署后”(或类似设置),它将被插入到生成的发布脚本的末尾

如果只有少数对象不会真正引入新对象,则可以为每个对象执行显式语句:

alterschema[foo]传输[dbo].[MyProc];
如果有时会添加大量对象和/或新对象,并且您不想忘记将它们添加到此部署后包含脚本,您可以循环浏览与该程序集关联的对象列表,以创建动态SQL脚本,该脚本可以移动所有对象,而无需硬编码程序集名称(从技术上讲,甚至可以使用MSBuild/SSDT变量进行动态):

DECLARE@SQL-NVARCHAR(MAX)=N';
选择@SQL+=N'ALTER SCHEMA[foo]TRANSFER[dbo]。'
+QUOTENAME(obj.[name])+N';'+NCHAR(0x0D)+NCHAR(0x0A)
来自sys.assembly\u模块amd
内部联接系统组件asm
在asm上。[assembly\u id]=amd。[assembly\u id]
内部联接sys.objects对象对象
在对象上。[object\u id]=amd。[object\u id]
其中asm.[name]=N'Company.Area.Technology.ProjectName'--不要在此处使用[and]
和SCHEMA_NAME(obj.[SCHEMA_id])=N'dbo'
打印@SQL;--调试(否则,注释掉)
EXEC(@SQL);

这可能是更优雅的解决方案。我的解决方案有一个问题,这个过程现在在数据库中有两次,一次使用
dbo
,另一次使用
foo
。谢谢您的输入。@mburm谢谢。我刚刚更新了动态脚本:-)@mburm请在此处查看我的最新更新:如果您使用的是Visual Studio 2012或更新版本,则根本不需要此更新。他们添加了一个发布配置文件选项来设置模式名。我已经找到了这个选项和一些文章,它们也向他们提供了提示。但我不认为这对我有帮助。我不仅有一个模式。目前有三个,可能还会有更多。如果我正确理解这个默认模式,我可以将它设置为一。@mburm正确,该选项适用于所有T-SQL包装器对象。因此,您可以对获取最多对象的模式使用该脚本,然后对其他两个模式使用带有
ALTER Schema
的部署后脚本。我刚刚更新以澄清这个特定场景。问题:现在该函数在数据库中包含了两次,分别在
dbo
foo
中。