2012-07-16 11 views
5

Mam zapytanie SQL, które akceptuje parametry. Teraz Kiedy próbuję włączyć to zapytanie do widoku, mam do czynienia z błędem, ponieważ widok nie może przechowywać parametrów tak jak SP lub funkcja.Tworzenie widoku SQL z parametrami

Stąd, gdybym musiał stworzyć widok, który musiał zawierać parametry, Czy jest jakiś sposób, że jest to możliwe?

Wiele Dzięki

+0

Odwiedzin ** ** nie mogą mieć parametrów - albo trzeba wrócić wszystkiego (a następnie użyć parametrów na select z w tym widoku) lub trzeba go przekonwertować na przechowywaną w tabeli funkcję zapisaną w postaci –

+0

możliwy duplikat [Utwórz sparametryzowany widok w SQL Server 2008] (http://stackoverflow.com/questions/4498364/create-parameterized-view-in -sql-server-2008) – Nickolay

Odpowiedz

6

Nie sądzę więc można utworzyć parametr w widoku .Ale można utworzyć funkcję, która przyjmuje parametr wejściowy jak poniżej.

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

ITVF (w ​​przeciwieństwie do TVF/SF) jest efektywnym spojrzeniem pod względem sposobu scalenia w ostateczne zapytanie. – user2864740

5

Nie from MSDN

tworzy tablicę wirtualnego, którego zawartość (wierszy i kolumn) zdefiniowany przez zapytanie. Użyj tej instrukcji, aby utworzyć widok danych w jednej lub więcej tabel w bazie danych. Na przykład, widok może być używany do następujących celach:

Aby ustawić ostrość, uprościć i dostosować postrzeganie każdy użytkownik ma bazy .

Jako mechanizm zabezpieczający, umożliwiając użytkownikom dostęp do danych za pośrednictwem widoku , bez przyznawania użytkownikom uprawnień do bezpośredniego dostępu do bazowych tabel bazowych .

Aby zapewnić kompatybilny wstecz interfejs do emulacji tabeli, której schemat został zmieniony na .

Tak w zasadzie, to działa podobnie jak stół, a jedyny sposób, że można dodać „parametry” na stole jest poprzez sprawozdania filtracyjnych przy dostępie pogląd

+0

To jest najbardziej racjonalne wyjaśnienie, o którym słyszałem, ponieważ zabrania sparametryzowanych widoków. Nadal jednak śmierdzi, gdy potrzebujesz parametrów do filtrowania podzapytań. – Suncat2000

0
nie

Zdecydowanie. Rozważ widok jako tabelę, która zawiera skompilowany zestaw danych (chociaż w rzeczywistości widok jest inny niż w tabeli) i dlatego nigdy nie może mieć żadnego parametru wejściowego, takiego jak sp lub funkcja.

0

Wy nigdy nie zrobili to za widok jest zupełnie inny stolik stworzony przez kwerendy i można zawierać parametry w tym zapytaniu .... to jest cholernie proste, jak dobrze

budować swój pogląd jak ty będzie wszelkie inne parametry ....

Przykład:

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] 

teraz nazwać ten pogląd tak:

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

Bardzo proste i bardzo wydajne, ponieważ można użyć widoku do udostępniania informacji UNALTERABLE dla podzbioru tabeli lub związku tabel.
Widok NIE jest stołem, a więc są rzeczy, których czasami nie możesz zrobić.

Ale to są te same rzeczy, których nie możesz zrobić, gdy utworzysz bardzo skomplikowane sprzężenie/połączenie w zapytaniu ...... używałem powyższego od 1999, więc wiem, że to działa ....

+5

Podczas gdy byłeś protekcjonalny, przegapiłeś fakt, że utworzyłeś procedurę przechowywaną, a nie widok. – Suncat2000

+0

dobrze dzięki. Szukałem sparametryzowanego widoku, a smarta ** mówi "pochyliłaś się, użyj tego" i zapisała zapisane procedury. – vaitrafra

0

View nie można bezpośrednio przekazać paramets, ale można użyć context_info np

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