2016-04-21 45 views
0

我需要從兩個視圖中選擇一個。 我想我的查詢的SQL是這樣的:從SQL Server中的兩個視圖中的一箇中選擇

'select * from MyViewFunction(1);' 

其中參數1將deside從中查看我應該選擇。

因此,在函數是這樣的:

CREATE FUNCTION MyViewFunction (@ViewId INTEGER) 
RETURNS TABLE 
AS 
    IF(@ViewId == 1) 
    BEGIN 
      RETURN (SELECT * FROM view1) 
    END 
     ELSE 
    BEGIN 
      RETURN (SELECT * FROM view2) 
    END 

除了這行不通。

任何建議將理解

+0

會發生什麼情況?你會得到什麼結果? 「不起作用」有點含糊 – Alex

回答

0

爲什麼不使用動態SQL

您將需要一個功能和一個過程。實際上,您可以將功能組合到程序中,但無論如何 -

CREATE VIEW view1 
AS 
SELECT 1 AS [Test1] 

CREATE VIEW view2 
AS 
SELECT 2 AS [Test2] 

CREATE FUNCTION dbo.fn_ReturnViewName (@Id INTEGER) 
RETURNS NVARCHAR(50) 
AS 
BEGIN 
    RETURN 
     CASE WHEN @Id = 1 THEN 'view1' WHEN @Id = 2 THEN 'view2' ELSE '' END 
END 


CREATE PROCEDURE MyViewProc (@ViewId INTEGER) 
AS 

DECLARE @SQL AS NVARCHAR(MAX) 
DECLARE @Name AS NVARCHAR(50) 
SET @Name = (SELECT dbo.fn_ReturnViewName(@ViewId)) 
SET @SQL = N' 

      SELECT * 
      FROM ' + @Name 

      EXEC sp_executesql 
      @stmt = @SQL; 

EXEC MyViewProc @ViewID =1 
EXEC MyViewProc @ViewID =2 
+0

無論如何改變它,都無法得到這個工作。 我想: 返回SELECT * FROM(選擇dbo.fn_ReturnViewName(1)) 和: RETURN SELECT * FROM(選擇dbo.fn_ReturnViewName(1)) 無該作品 –

+0

請檢查編輯。 – freakyhat

2

即聲明一個內聯表值函數,即,根據定義,只能包含單個SELECT語句。

如果你必須這樣做,那麼你需要一個多語句表值函數,請注意,雖然這看起來不像我想在生產環境中看到的東西,但你需要退後一點到一個'正確的'解決方案...雖然看起來沒有足夠的信息來說。

link將給出更詳細的信息在兩者的操作差異。