Pergunta

Eu estou trabalhando em um CLR com base Linq procedimento armazenado por algum filtragem e manipulação complexa, que de outro modo exigiria um monte de confuso e código T-SQL mal performance, se implementadas de uma forma mais "tradicional" Stored Procedure.

Esse é um trabalho grande, mas não consigo encontrar como definir o esquema deste procedimento armazenado em fase de implantação, para uma melhor organização e separação dos objetos de banco de dados em módulos.

Todas as idéias?

Muito obrigado antecipadamente.

Foi útil?

Solução

Quando você cria o procedimento fazendo referência a montagem você pode criar esse wrapper sendo possuído por qualquer esquema que você deseja. Consulte Este artigo MSDN sobre a implantação de procedimentos CLR armazenados para uma explicação passo a passo de como fazer implantar um procedimento armazenado. Ao alterar a instrução de procedimento criar para algo como:

CREATE SCHEMA foo

CREATE PROCEDURE foo.hello
AS
EXTERNAL NAME helloworld.HelloWorldProc.HelloWorld

Você pode agora ter um procedimento de propriedade do esquema foo.

Outras dicas

UPDATE: No Visual Studio 2012 isso agora pode ser realizado através da janela de propriedades do projeto de um "SQL Server banco de dados do projeto." A propriedade relevante é "Default Schema" na guia "Configurações do projeto". Modificando este valor modifica o script de implantação gerado para colocar o nome do esquema na frente de funções, procedimentos armazenados, etc ... Certifique-se de adicionar um objeto de esquema para o seu projecto com o mesmo nome, ou você receberá erros de compilação.


Eu não sei qual a versão do Visual Studio que você está usando, mas quando você criar um CLR armazenados projeto procedimento no Visual Studio 2010, o projeto inclui dois scripts SQL:. PreDeploymentScript.sql e PostDeploymentScript.sql

Nós apenas usá-los para coisas maniuplate do jeito que queremos.

No script pré-implantação, temos algo parecido com isto:

-- DROP EXISTING ITEM FROM CURRENT SCHEMA
IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[Utilities].[fn_Create_Md5_Hash]') AND type in (N'FN', N'IF', N'TF', N'FS', N'FT'))
DROP FUNCTION [Utilities].[fn_Create_Md5_Hash]
GO

Em seguida, no script pós-implantação, temos o seguinte:

-- DEPLOYMENT WIZARD RECREATES ITEM IN dbo SCHEMA
-- DROP NEW ITEM FROM dbo SCHEMA
IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[fn_Create_Md5_Hash]') AND type in (N'FN', N'IF', N'TF', N'FS', N'FT'))
DROP FUNCTION [dbo].[fn_Create_Md5_Hash]
GO

-- RECREATE THE ITEM BACK IN THE SCHEMA YOU WANT
CREATE FUNCTION [Utilities].[fn_Create_Md5_Hash](@source [varbinary](max))
RETURNS [varbinary](8000) WITH EXECUTE AS CALLER
AS 
EXTERNAL NAME [NameSpace].[UserDefinedFunctions].[fn_Create_Md5_Hash]
GO

Espero que ajude!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top