2012-07-16 131 views
5

我有一個接受參數的SQL查詢。現在,當我試圖將該查詢包含到視圖中時,我正面臨一個錯誤,因爲視圖不能像SP或函數那樣容納參數。使用參數創建SQL視圖

因此,如果我不得不創建必須包含參數的視圖,有沒有可能呢?

非常感謝

+0

意見**不能**有參數 - 要麼你需要返回的一切(再使用上的選擇從參數該視圖),或者您需要將其轉換爲表值存儲函數 – 2012-07-16 13:03:41

+0

[在SQL Server 2008中創建參數化視圖]的可能重複(http://stackoverflow.com/questions/4498364/create-parameterized-view-in -sql-server-2008) – Nickolay 2013-05-04 13:01:15

回答

6

我不這麼認爲,你可以創建一個視圖。但一個參數,你可以創建一個函數,該函數的輸入參數類似下面。

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

ITVF(與TVF/SF相對)實際上就是如何將它合併到最終查詢中。 – user2864740 2017-05-01 16:43:26

5

否,from MSDN

創建一個虛擬表,其內容(列和行)由查詢定義 。使用此語句在數據庫中創建一個或更多表中的數據視圖。例如,一個視圖可以用於以下目的:

要關注,簡化和自定義每個用戶對數據庫的看法 。

作爲一個安全機構通過允許用戶通過 視圖訪問數據,而無需授予用戶的權限來直接訪問 底層基表。

提供向後兼容接口來模擬其模式已更改的表。

所以,基本上,這種行爲就像一個表,你可以添加「參數」的表中的唯一方法是通過過濾器語句訪問視圖

+0

這是我聽到的禁止參數化視圖的最合理的解釋。儘管如此,當你需要參數來過濾子查詢時仍然很糟糕。 – Suncat2000 2017-01-04 21:45:33

0

非也時。 考慮作爲一個表,其中包含一個編譯的數據集(儘管實際上視圖不同於表),因此它永遠不會有任何輸入參數,如sp或函數。

0

你們從來沒有做過這作爲視圖是由查詢創建完全是另外一個表,你可以包括在查詢參數....這真是太簡單以及

建立你的觀點一樣,你會任何其他與參數....

實施例:

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] 

現在請像這樣的觀點:

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

非常簡單且非常強大,因爲您可以使用視圖向表的子集或表聯合提供UNALTERABLE信息。
視圖不是表格,所以有些東西你有時不能做。

但是,當你在一個查詢中形成一個非常複雜的連接/聯合時,這些都是你不能做的事情......自1999年以來一直使用上面的那個,所以我知道它的工作原理....

+5

當你居高臨下時,你錯過了創建存儲過程而不是視圖的事實。 – Suncat2000 2017-01-04 21:45:51

+0

非常感謝。我搜索參數化視圖,smarta **說「你彎腰,使用這個」並編寫一個存儲過程。 – vaitrafra 2017-07-19 12:54:13

0

視圖不能直接通過paramets,但你可以用context_info,例如

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