Pregunta

Estoy trabajando en un CLR basado LINQ procedimiento almacenado durante algún filtrado y manipulación compleja, que de otro modo requeriría una gran cantidad de código T-SQL desordenado y mal performant, si se implementa en un "tradicional" más procedimientos almacenados.

Esto funciona muy bien, pero no puedo encontrar cómo configurar el esquema de este procedimiento almacenado en la fase de despliegue, para una mejor organización y la separación de los objetos de la base de módulos.

¿Alguna idea?

Muchas gracias de antemano.

¿Fue útil?

Solución

Cuando se crea el procedimiento de referencia a la asamblea puede crear este contenedor siendo propiedad de cualquier esquema que desea. Ver Este artículo de MSDN sobre el despliegue de procedimientos CLR almacenado para un tutorial de cómo hacer desplegar un procedimiento almacenado. Al cambiar la sentencia de creación procedimiento para algo como:

CREATE SCHEMA foo

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

Ahora puede tener un procedimiento de propiedad de la foo esquema.

Otros consejos

ACTUALIZACIÓN: En Visual Studio 2012 esto ahora se puede lograr a través de la ventana de propiedades del proyecto de un "Proyecto de base de datos SQL Server." La propiedad relevante es "Esquema predeterminado" en la pestaña "Configuración del proyecto". La modificación de este valor modifica la secuencia de comandos de despliegue generado para poner el nombre de esquema en frente de las funciones, procedimientos almacenados, etc ... Asegúrese de añadir un objeto de esquema para su proyecto con el mismo nombre o se obtendrá errores de generación.


No sé qué versión de Visual Studio que está utilizando, pero cuando se crea un proyecto CLR procedimiento almacenado en Visual Studio 2010, el proyecto incluye dos secuencias de comandos SQL:. PreDeploymentScript.sql y PostDeploymentScript.sql

Nos limitamos a usar estos para maniuplate cosas de la manera que queremos.

En el guión antes del despliegue, tenemos algo como esto:

-- 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

A continuación, en la secuencia de comandos posterior a la implementación, tenemos esto:

-- 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 ayude!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top