2015-12-28 55 views
0

我想在下面的請求結束時創建一個視圖。 我知道'創建視圖'必須是查詢批處理中的第一條語句。我的問題是,對於這個查詢,我必須使用一個變量(@listOfIDRUB)。 這個變量只能在我的小腳本結尾正確填寫。我們可以在一個變量的腳本之後創建一個視圖嗎?

我也嘗試在我的第一個聲明之前創建視圖,但它創建了一個與「DECLARE」的問題。

那麼是否有可能從我的腳本的結果很容易地創建一個視圖或我必須做別的事情?

DECLARE @CounterResId int; 
DECLARE @lePath varchar(255); 
DECLARE @listOfIDRUB TABLE (EXTERNALREFERENCE uniqueidentifier, ID varchar(255), DOCID varchar(255)); 
DECLARE @Max int; 

SET @lePath = ''; 
SET @CounterResId = 1; 
SET @Max = (SELECT COUNT(*) FROM SYNTHETIC..EXTRANET_PURGE WHERE TYPE_SUPPR = 'ResId') 

WHILE (@CounterResId <= @Max) 
BEGIN; 
    set @lePath = 
    (select tmp.lePath from 
    (
     select row_number() over(order by path)as NumLigne, CONCAT(path, '%') as lePath from RUBRIQUE 
     WHERE MODELE = 'CAEEE64D-2B00-44EF-AA11-6B72ABD9FE38' 
     and CODE in (SELECT ID FROM SYNTHETIC..EXTRANET_PURGE where TYPE_SUPPR='ResId') 
    ) tmp 
    WHERE tmp.NumLigne = @CounterResId) 
    INSERT INTO @listOfIDRUB(EXTERNALREFERENCE, ID, DOCID) 
      SELECT SEC.EXTERNALREFERENCE , SEC.ID, SEC.DOCUMENTID 
      FROM WEBACCESS_FRONT..SECTIONS sec 
      inner join rubrique rub ON rub.ID_RUBRIQUE = sec.EXTERNALREFERENCE 
      inner join template_tree_item tti ON tti.id_template_tree_item = rub.modele 
      inner join template t    ON t.id_template = tti.template 
      WHERE t.CODE IN (SELECT TEMPLATE_CODE from SYNTHETIC..EasyFlowEngineListTemplateCode) 
      and rub.path like @lePath 
    print @CounterResId; 
    print @lePath; 
    set @CounterResId = @CounterResId + 1; 
END; 
    select * from @listOfIDRUB; 

而不是select * from @listOfIDRUB

我想create view test as select * from listOfIDRUB 我也曾嘗試創建視圖測試爲(我的所有要求)

+0

在'NVARCHAR'和'EXECUTE'中構建'CREATE VIEW'語句。 –

+0

@TT。如果我正確理解OP,他想從整個陳述中創建一個VIEW - 這不會起作用... – Shnugo

回答

1

每當你問一些有關SQL,請註明您的RDBMS(產品和版本) 。答案是高度依賴於此...

從您的代碼,我認爲這是SQL Server。

因此,對於您的問題:不,VIEW必須是「可嵌入的」(單語句或「臨時」)語句。

您可能會考慮多語句UDF,但幾乎在所有情況下都是壞事(性能不佳)。只有這樣,如果你的結果表將由相當少的行組成!

不知道你的表,這是相當盲目的走,不過你可以試試這個(添加參數,如果你可以將外部操作(如過濾)到函數):

CREATE FUNCTION dbo.MyFunction() 
RETURNS @listOfIDRUB TABLE (EXTERNALREFERENCE uniqueidentifier, ID varchar(255), DOCID varchar(255)) 
AS 
BEGIN 
    DECLARE @CounterResId int; 
    DECLARE @lePath varchar(255); 
    DECLARE @Max int; 

    SET @lePath = ''; 
    SET @CounterResId = 1; 
    SET @Max = (SELECT COUNT(*) FROM SYNTHETIC..EXTRANET_PURGE WHERE TYPE_SUPPR = 'ResId') 

    WHILE (@CounterResId <= @Max) 
    BEGIN; 
     set @lePath = 
     (select tmp.lePath from 
     (
      select row_number() over(order by path)as NumLigne, CONCAT(path, '%') as lePath from RUBRIQUE 
      WHERE MODELE = 'CAEEE64D-2B00-44EF-AA11-6B72ABD9FE38' 
      and CODE in (SELECT ID FROM SYNTHETIC..EXTRANET_PURGE where TYPE_SUPPR='ResId') 
     ) tmp 
     WHERE tmp.NumLigne = @CounterResId) 
     INSERT INTO @listOfIDRUB(EXTERNALREFERENCE, ID, DOCID) 
       SELECT SEC.EXTERNALREFERENCE , SEC.ID, SEC.DOCUMENTID 
       FROM WEBACCESS_FRONT..SECTIONS sec 
       inner join rubrique rub ON rub.ID_RUBRIQUE = sec.EXTERNALREFERENCE 
       inner join template_tree_item tti ON tti.id_template_tree_item = rub.modele 
       inner join template t    ON t.id_template = tti.template 
       WHERE t.CODE IN (SELECT TEMPLATE_CODE from SYNTHETIC..EasyFlowEngineListTemplateCode) 
       and rub.path like @lePath 
     --print @CounterResId; 
     --print @lePath; 
     set @CounterResId = @CounterResId + 1; 
    END; 

    RETURN; 
END 

你可以把它像這個(非常類似於VIEW)

SELECT * FROM dbo.MyFunction(); 

而且你甚至可以在連接使用它......

最後但並非最不重要的,我十分肯定,那人能解決次沒有聲明和循環太...

+0

這正是我所需要的。謝謝 ! –

+0

@ JeanJacques1998,很高興在這裏,快樂的編碼! – Shnugo

相關問題