2012-07-16 34 views
5

Tengo una consulta SQL que acepta parámetros. Ahora, cuando intento incluir esa consulta en una vista, me aparece un error porque una vista no puede contener un parámetro como un SP o una función.Crear una vista SQL con los parámetros

Por lo tanto, si tuviera que crear la vista que debía contener los parámetros, ¿es posible de alguna manera?

Muchas Gracias

+0

Vistas ** ** no pueden tener parámetros - ya sea que necesite devolver todo (y luego utilizar los parámetros en el selecto de esa vista), o necesita convertirla en una función almacenada con valores de tabla –

+0

posible duplicado de [Crear vista parametrizada en SQL Server 2008] (http://stackoverflow.com/questions/4498364/create-parameterized-view-in -sql-server-2008) – Nickolay

Respuesta

6

no creo que por lo que puede crear un parámetro en una vista Pero usted puede crear una función que toma parámetro de entrada como la de abajo.

CREATE FUNCTION dbo.Sample (@Parameter varchar(10)) 
RETURNS TABLE 
AS 
RETURN 
(
SELECT Field1, Field2,.... 
FROM YourTable 
WHERE Field3 = @Parameter 
) 
+0

Un ITVF (a diferencia de un TVF/SF) es efectivamente una vista en términos de cómo se fusiona en la consulta final. – user2864740

5

No, from MSDN

crea una tabla virtual cuyos contenidos (columnas y filas) se definen por una consulta. Utilice esta declaración para crear una vista de los datos en una o más tablas en la base de datos . Por ejemplo, un punto de vista puede ser usado para los propósitos siguientes:

Para enfocar, simplificar y personalizar la percepción que cada usuario tiene de la base de datos .

Como un mecanismo de seguridad al permitir a los usuarios acceder a los datos a través de la vista , sin otorgar a los usuarios permisos para acceder directamente a las tablas base subyacentes .

Para proporcionar una interfaz compatible hacia atrás para emular una tabla cuyo esquema ha cambiado.

Así que, básicamente, este se comporta igual que una mesa, y la única manera que se puede añadir "parámetros" a una mesa es a través de instrucciones de filtro cuando se accede a la vista

+0

Esa es la explicación más racional que he escuchado para prohibir las vistas parametrizadas. Aún apesta, sin embargo, cuando se necesitan parámetros para filtrar subconsultas. – Suncat2000

0
no

Definitivamente. Considere la vista como una tabla que contiene un conjunto compilado de datos (aunque en términos reales la vista es diferente de la tabla) y, por lo tanto, nunca puede tener ningún parámetro de entrada como una sp o una función.

0

Ustedes nunca han hecho esto como una vista es una tabla de otro conjunto creado por una consulta y puede incluir parámetros en esa consulta se está volviendo loco .... sencilla, así

construir su punto de vista como lo haría cualquier otra con los parámetros ....

Ejemplo:

USE [iepa] 
GO 
/****** Object: StoredProcedure [dbo].[get_Batch_Data] Script Date: 06/30/2015 11:41:38 ******/ 
SET ANSI_NULLS OFF 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
ALTER PROCEDURE [dbo].[get_Batch_Data] 
@inparm varchar(12) 
AS 
select * 
from batch_data 
where [email protected] 

ahora llamada que vista como esta:

select from get_batch_data('61404') <<<< 61404 is the parameter being passed.... 

Bastante simple y muy potente, ya que puede utilizar una vista para proporcionar información INALTERABLE a un subconjunto de una tabla o una unión de tablas.
Una vista NO es la tabla y hay cosas que a veces no puedes hacer.

Pero estas son las mismas cosas que no se pueden hacer cuando se forma una unión/unión muy complicada en una consulta ...... he estado utilizando la anterior desde 1999, así que sé que funciona ...

+5

Mientras era condescendiente, no se dio cuenta de que creó un procedimiento almacenado, no una vista. – Suncat2000

+0

bien gracias. Busqué una vista parametrizada y el smarta ** dice "te detuviste, usa esto" y escribe un procedimiento almacenado. – vaitrafra

0

Vista no puede pasar paramets directamente, pero se puede utilizar context_info, por ejemplo

declare @v varbinary(8) 
set @v = cast(cast(floor(current_timestamp as float)) as bigint) as varbinary) -- 
set context_info @v -- save 
select * from my_viev 

create my_view as 
with CTE(date) as (
    select cast(cast(substring(context_info(),1,8) as bigint) as datetime) date -- read 
) 
select * from filials p 
left join filials rea on rea.number = p.number 
and (date between   rea.dateopen and '12.12.9999') 
where date between p.datestart and p.datestop 
Cuestiones relacionadas